Číst v angličtině

Sdílet prostřednictvím


Procházení schémat XML

Procházení schématu XML pomocí rozhraní API modelu objektu schématu (SOM) poskytuje přístup k prvkům, atributům a typům uloženým v SOM. Procházení schématu XML načteného do SOM je také prvním krokem při úpravě schématu XML pomocí rozhraní SOM API.

Procházení schématu XML

Následující vlastnosti třídy XmlSchema poskytují přístup ke kolekci všech globálních položek přidaných do schématu XML.

Vlastnictví Typ objektu uložený v kolekci nebo poli
Elements XmlSchemaElement
Attributes XmlSchemaAttribute
AttributeGroups XmlSchemaAttributeGroup
Groups XmlSchemaGroup
Includes XmlSchemaExternal, XmlSchemaInclude, XmlSchemaImportnebo XmlSchemaRedefine
Items XmlSchemaObject (poskytuje přístup ke všem prvkům globální úrovně, atributům a typům).
Notations XmlSchemaNotation
SchemaTypes XmlSchemaType, XmlSchemaSimpleType, XmlSchemaComplexType
UnhandledAttributes XmlAttribute (poskytuje přístup k atributům, které nepatří do oboru názvů schématu)

Poznámka

Všechny vlastnosti uvedené v tabulce výše, s výjimkou vlastnosti Items, jsou vlastnosti Post-Schema-Compilation-Infoset (PSCI), které nejsou k dispozici, dokud nebude schéma zkompilováno. Vlastnost Items je vlastnost před kompilací schématu, kterou lze použít před kompilací schématu pro přístup k prvkům, atributům a typům globální úrovně a jejich úpravám.

Vlastnost UnhandledAttributes poskytuje přístup ke všem atributům, které nepatří do oboru názvů schématu. Tyto atributy procesor schématu nezpracovávají.

Následující příklad kódu ukazuje procházení schématu zákazníka vytvořeného v tématu Sestavení schémat XML. Příklad kódu ukazuje procházení schématu pomocí výše popsaných kolekcí a zapíše všechny prvky a atributy ve schématu do konzoly.

Ukázka prochází schématem zákazníka v následujících krocích.

  1. Přidá schéma zákazníka do nového objektu XmlSchemaSet a pak ho zkompiluje. Všechna upozornění na ověření schématu a chyby, ke kterým došlo při čtení nebo kompilaci schématu, zpracovává ValidationEventHandler delegát.

  2. Načte zkompilovaný objekt XmlSchema z XmlSchemaSet iterováním přes vlastnost Schemas. Vzhledem k tomu, že je schéma zkompilováno, jsou vlastnosti Post-Schema-Compilation-Infoset (PSCI) přístupné.

  3. Iteruje přes každý XmlSchemaElement v kolekci Values v kolekci XmlSchema.Elements po kompilaci schématu a zapisuje název každého prvku do konzoly.

  4. Získá komplexní typ elementu Customer pomocí třídy XmlSchemaComplexType.

  5. Pokud má komplexní typ nějaké atributy, získá IDictionaryEnumerator pro výčet každého XmlSchemaAttribute a zapíše jeho název do konzoly.

  6. Získá částici sekvence komplexního typu pomocí třídy XmlSchemaSequence.

  7. Iteruje přes každou XmlSchemaElement v kolekci XmlSchemaSequence.Items a zapíše název každého podřízeného prvku na konzoli.

Následuje kompletní příklad kódu.

C#
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);
    }
}

Vlastnost XmlSchemaElement.ElementSchemaType může být XmlSchemaSimpleTypenebo XmlSchemaComplexType, pokud se jedná o uživatelem definovaný jednoduchý typ nebo komplexní typ. Může to být také XmlSchemaDatatype, pokud se jedná o jeden z předdefinovaných datových typů dle doporučení W3C XML Schema. Ve schématu zákazníka je ElementSchemaType elementu CustomerXmlSchemaComplexTypea prvky FirstName a LastName jsou XmlSchemaSimpleType.

Příklad kódu v tématu Sestavení schémat XML použil kolekci XmlSchemaComplexType.Attributes k přidání atributu CustomerId do elementu Customer. Toto je vlastnost před kompilací schématu. Odpovídající vlastností Post-Schema-Compilation-Infoset je kolekce XmlSchemaComplexType.AttributeUses, která obsahuje všechny atributy komplexního typu, včetně těch, které jsou děděny prostřednictvím odvození typu.

Viz také