Freigeben über


Xml-Schemas durchlaufen

Das Durchlaufen eines XML-Schemas mithilfe der SOM-API (Schema Object Model) ermöglicht den Zugriff auf die Elemente, Attribute und Typen, die im SOM gespeichert sind. Das Durchlaufen eines in das SOM geladenen XML-Schemas ist auch der erste Schritt beim Bearbeiten eines XML-Schemas mithilfe der SOM-API.

Durchlaufen eines XML-Schemas

Die folgenden Eigenschaften der XmlSchema Klasse bieten Zugriff auf die Auflistung aller globalen Elemente, die dem XML-Schema hinzugefügt wurden.

Eigentum Objekttyp, der in der Auflistung oder im Array gespeichert ist
Elements XmlSchemaElement
Attributes XmlSchemaAttribute
AttributeGroups XmlSchemaAttributeGroup
Groups XmlSchemaGroup
Includes XmlSchemaExternal, XmlSchemaInclude, XmlSchemaImport oder XmlSchemaRedefine
Items XmlSchemaObject (bietet Zugriff auf alle Elemente, Attribute und Typen auf globaler Ebene).
Notations XmlSchemaNotation
SchemaTypes XmlSchemaType, XmlSchemaSimpleTypeXmlSchemaComplexType
UnhandledAttributes XmlAttribute (bietet Zugriff auf Attribute, die nicht zum Schemanamespace gehören)

Hinweis

Alle in der obigen Tabelle aufgeführten Eigenschaften, mit Ausnahme der Items Eigenschaft, sind Post-Schema-Compilation-Infoset (PSCI)-Eigenschaften, die erst verfügbar sind, wenn das Schema kompiliert wurde. Die Items Eigenschaft ist eine Vorschemakompilierungseigenschaft, die verwendet werden kann, bevor das Schema kompiliert wurde, um auf alle Elemente, Attribute und Typen auf globaler Ebene zuzugreifen und diese zu bearbeiten.

Die UnhandledAttributes Eigenschaft bietet Zugriff auf alle Attribute, die nicht zum Schemanamespace gehören. Diese Attribute werden vom Schemaprozessor nicht verarbeitet.

Das folgende Codebeispiel veranschaulicht das Durchlaufen des kundenschemas, das im Thema "Building XML Schemas" erstellt wurde. Das Codebeispiel veranschaulicht das Durchlaufen des Schemas mithilfe der oben beschriebenen Auflistungen und schreibt alle Elemente und Attribute im Schema in die Konsole.

Im Beispiel wird das Kundenschema in den folgenden Schritten durchlaufen.

  1. Fügt das Kundenschema zu einem neuen XmlSchemaSet Objekt hinzu und kompiliert es. Alle Warnungen und Fehler bei der Schemaüberprüfung, die beim Lesen oder Kompilieren des Schemas aufgetreten sind, werden vom ValidationEventHandler Delegat behandelt.

  2. Ruft das kompilierte XmlSchema Objekt aus dem XmlSchemaSet durch Durchlaufen der Schemas Eigenschaft ab. Da das Schema kompiliert ist, sind die Post-Schema-Compilation-Infoset (PSCI)-Eigenschaften zugänglich.

  3. Durchlaufen Sie die einzelnen XmlSchemaElement Elemente in der Values Sammlung der Sammlung nach der Schemakompilierung XmlSchema.Elements , die den Namen der einzelnen Elemente in die Konsole schreibt.

  4. Ruft den komplexen Typ des Customer Elements mithilfe der XmlSchemaComplexType Klasse ab.

  5. Wenn der komplexe Typ über Attribute verfügt, ruft eine IDictionaryEnumerator Aufzählung über die einzelnen XmlSchemaAttribute Attribute ab und schreibt seinen Namen in die Konsole.

  6. Ruft die Sequenzpartikel des komplexen Typs mithilfe der XmlSchemaSequence Klasse ab.

  7. Durchlaufen Sie die einzelnen XmlSchemaElement Elemente in der XmlSchemaSequence.Items Auflistung, die den Namen jedes untergeordneten Elements in die Konsole schreiben.

Im Folgenden sehen Sie das vollständige Codebeispiel.

using System;
using System.Collections;
using System.Xml;
using System.Xml.Schema;

class XmlSchemaTraverseExample
{
    static void Main()
    {
        // Add the customer schema to a new XmlSchemaSet and compile it.
        // Any schema validation warnings and errors encountered reading or
        // compiling the schema are handled by the ValidationEventHandler delegate.
        XmlSchemaSet schemaSet = new XmlSchemaSet();
        schemaSet.ValidationEventHandler += new ValidationEventHandler(ValidationCallback);
        schemaSet.Add("http://www.tempuri.org", "customer.xsd");
        schemaSet.Compile();

        // Retrieve the compiled XmlSchema object from the XmlSchemaSet
        // by iterating over the Schemas property.
        XmlSchema customerSchema = null;
        foreach (XmlSchema schema in schemaSet.Schemas())
        {
            customerSchema = schema;
        }

        // Iterate over each XmlSchemaElement in the Values collection
        // of the Elements property.
        foreach (XmlSchemaElement element in customerSchema.Elements.Values)
        {

            Console.WriteLine($"Element: {element.Name}");

            // Get the complex type of the Customer element.
            XmlSchemaComplexType complexType = element.ElementSchemaType as XmlSchemaComplexType;

            // If the complex type has any attributes, get an enumerator
            // and write each attribute name to the console.
            if (complexType.AttributeUses.Count > 0)
            {
                IDictionaryEnumerator enumerator =
                    complexType.AttributeUses.GetEnumerator();

                while (enumerator.MoveNext())
                {
                    XmlSchemaAttribute attribute =
                        (XmlSchemaAttribute)enumerator.Value;

                    Console.WriteLine($"Attribute: {attribute.Name}");
                }
            }

            // Get the sequence particle of the complex type.
            XmlSchemaSequence sequence = complexType.ContentTypeParticle as XmlSchemaSequence;

            // Iterate over each XmlSchemaElement in the Items collection.
            foreach (XmlSchemaElement childElement in sequence.Items)
            {
                Console.WriteLine($"Element: {childElement.Name}");
            }
        }
    }

    static void ValidationCallback(object sender, ValidationEventArgs args)
    {
        if (args.Severity == XmlSeverityType.Warning)
            Console.Write("WARNING: ");
        else if (args.Severity == XmlSeverityType.Error)
            Console.Write("ERROR: ");

        Console.WriteLine(args.Message);
    }
}
Imports System.Collections
Imports System.Xml
Imports System.Xml.Schema

Class XmlSchemaTraverseExample

    Shared Sub Main()

        ' Add the customer schema to a new XmlSchemaSet and compile it.
        ' Any schema validation warnings and errors encountered reading or 
        ' compiling the schema are handled by the ValidationEventHandler delegate.
        Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
        AddHandler schemaSet.ValidationEventHandler, AddressOf ValidationCallback
        schemaSet.Add("http://www.tempuri.org", "customer.xsd")
        schemaSet.Compile()

        ' Retrieve the compiled XmlSchema object from the XmlSchemaSet
        ' by iterating over the Schemas property.
        Dim customerSchema As XmlSchema = Nothing
        For Each schema As XmlSchema In schemaSet.Schemas()
            customerSchema = schema
        Next

        ' Iterate over each XmlSchemaElement in the Values collection
        ' of the Elements property.
        For Each element As XmlSchemaElement In customerSchema.Elements.Values

            Console.WriteLine("Element: {0}", element.Name)

            ' Get the complex type of the Customer element.
            Dim complexType As XmlSchemaComplexType = CType(element.ElementSchemaType, XmlSchemaComplexType)

            ' If the complex type has any attributes, get an enumerator 
            ' and write each attribute name to the console.
            If complexType.AttributeUses.Count > 0 Then

                Dim enumerator As IDictionaryEnumerator = _
                    complexType.AttributeUses.GetEnumerator()

                While enumerator.MoveNext()

                    Dim attribute As XmlSchemaAttribute = _
                        CType(enumerator.Value, XmlSchemaAttribute)

                    Console.WriteLine("Attribute: {0}", Attribute.Name)
                End While
            End If

            ' Get the sequence particle of the complex type.
            Dim sequence As XmlSchemaSequence = CType(complexType.ContentTypeParticle, XmlSchemaSequence)

            For Each childElement As XmlSchemaElement In sequence.Items
                Console.WriteLine("Element: {0}", childElement.Name)
            Next
        Next

    End Sub

    Shared Sub ValidationCallback(ByVal sender As Object, ByVal args As ValidationEventArgs)
        If args.Severity = XmlSeverityType.Warning Then
            Console.Write("WARNING: ")
        Else
            If args.Severity = XmlSeverityType.Error Then
                Console.Write("ERROR: ")
            End If
        End If
        Console.WriteLine(args.Message)
    End Sub

End Class

Die XmlSchemaElement.ElementSchemaType Eigenschaft kann ein XmlSchemaSimpleType benutzerdefinierter einfacher Typ oder ein komplexer Typ seinXmlSchemaComplexType. Es kann auch sein XmlSchemaDatatype , wenn es sich um einen der integrierten Datentypen handelt, die in der W3C-XML-Schemaempfehlung definiert sind. Im Kundenschema ist ElementSchemaTypedas CustomerXmlSchemaComplexType Element , und die FirstName Elemente LastName sind XmlSchemaSimpleType.

Im Codebeispiel im Thema "Building XML Schemas" wurde die XmlSchemaComplexType.Attributes Auflistung verwendet, um das Attribut CustomerId dem Customer Element hinzuzufügen. Dies ist eine Vorschemakompilierungseigenschaft. Die entsprechende Post-Schema-Compilation-Infoset-Eigenschaft ist die XmlSchemaComplexType.AttributeUses Auflistung, die alle Attribute des komplexen Typs enthält, einschließlich der Attribute, die durch Typableitung geerbt werden.

Siehe auch