Megosztás a következőn keresztül:


XML-sémák bejárása

Ha egy XML-sémát a Sémaobjektum-modell (SOM) API használatával tesz meg, hozzáférést biztosít az SOM-ban tárolt elemekhez, attribútumokhoz és típusokhoz. Az XML-sémák SOM API-val történő szerkesztésének első lépése egy XML-séma bejárása az SOM API-ba.

XML-séma bejárása

Az osztály alábbi tulajdonságai XmlSchema hozzáférést biztosítanak az XML-sémához hozzáadott összes globális elem gyűjteményéhez.

Tulajdonság A gyűjteményben vagy tömbben tárolt objektumtípus
Elements XmlSchemaElement
Attributes XmlSchemaAttribute
AttributeGroups XmlSchemaAttributeGroup
Groups XmlSchemaGroup
Includes XmlSchemaExternal, XmlSchemaInclude, XmlSchemaImportvagy XmlSchemaRedefine
Items XmlSchemaObject (hozzáférést biztosít az összes globális szintű elemhez, attribútumhoz és típushoz).
Notations XmlSchemaNotation
SchemaTypes XmlSchemaType, , XmlSchemaSimpleTypeXmlSchemaComplexType
UnhandledAttributes XmlAttribute (hozzáférést biztosít olyan attribútumokhoz, amelyek nem tartoznak a sémanévtérhez)

Feljegyzés

A fenti táblázatban felsorolt összes tulajdonság – a Items tulajdonság kivételével – a séma fordításáig nem elérhető Post-Schema-Compilation-Infoset (PSCI) tulajdonságok. A Items tulajdonság egy séma-összeállítás előtti tulajdonság, amely a séma fordítása előtt használható az összes globális szintű elem, attribútum és típus eléréséhez és szerkesztéséhez.

A UnhandledAttributes tulajdonság hozzáférést biztosít az összes olyan attribútumhoz, amely nem tartozik a sémanévtérhez. Ezeket az attribútumokat a sémafeldolgozó nem dolgozza fel.

Az alábbi kód példája bemutatja az XML-sémák készítése témakörben létrehozott ügyfélséma bejárását . A példakód bemutatja a séma bejárását a fent ismertetett gyűjtemények használatával, és a séma összes elemét és attribútumát a konzolra írja.

A minta a következő lépésekben lépi át az ügyfélsémát.

  1. Hozzáadja az ügyfélsémát egy új XmlSchemaSet objektumhoz, majd lefordítja. A sémaolvasással vagy -összeállítással kapcsolatos sémaérvényesítési figyelmeztetéseket és hibákat a ValidationEventHandler meghatalmazott kezeli.

  2. Lekéri a lefordított XmlSchema objektumot a XmlSchemaSet tulajdonságon keresztüli Schemas iterálással. Mivel a séma lefordítva van, a post-schema-compilation-infoset (PSCI) tulajdonságok elérhetők.

  3. Az egyes elemek nevét a Values konzolra író séma-összeállítás XmlSchema.Elements utáni gyűjtemény gyűjteményének minden XmlSchemaElement egyes elemét átfuttatja.

  4. Lekéri az elem összetett típusát az CustomerXmlSchemaComplexType osztály használatával.

  5. Ha az összetett típus rendelkezik attribútumokkal, a rendszer számba veszi IDictionaryEnumerator azokat XmlSchemaAttribute , és a nevét a konzolra írja.

  6. Lekéri a komplex típusú sorozatrészecskét az XmlSchemaSequence osztály használatával.

  7. A gyűjtemény minden XmlSchemaSequence.Items elemét XmlSchemaElement átfuttatva írja az egyes gyermekelemek nevét a konzolra.

Az alábbi példa a teljes kódra mutat.

#using <System.Xml.dll>

using namespace System;
using namespace System::Collections;
using namespace System::Xml;
using namespace System::Xml::Schema;

ref class XmlSchemaTraverseExample
{
public:

    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 = gcnew XmlSchemaSet();
        schemaSet->ValidationEventHandler += gcnew 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 = nullptr;
        for each (XmlSchema^ schema in schemaSet->Schemas())
        {
            customerSchema = schema;
        }

        // Iterate over each XmlSchemaElement in the Values collection
        // of the Elements property.
        for each (XmlSchemaElement^ element in customerSchema->Elements->Values)
        {

            Console::WriteLine("Element: {0}", element->Name);

            // Get the complex type of the Customer element.
            XmlSchemaComplexType^ complexType = dynamic_cast<XmlSchemaComplexType^>(element->ElementSchemaType);

            // 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 =
                        dynamic_cast<XmlSchemaAttribute^>(enumerator->Value);

                    Console::WriteLine("Attribute: {0}", attribute->Name);
                }
            }

            // Get the sequence particle of the complex type.
            XmlSchemaSequence^ sequence = dynamic_cast<XmlSchemaSequence^>(complexType->ContentTypeParticle);

            // Iterate over each XmlSchemaElement in the Items collection.
            for each (XmlSchemaElement^ childElement in sequence->Items)
            {
                Console::WriteLine("Element: {0}", 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);
    }
};

int main()
{
    XmlSchemaTraverseExample::Main();
    return 0;
};
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: {0}", 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: {0}", 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: {0}", 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

A XmlSchemaElement.ElementSchemaType tulajdonság lehet XmlSchemaSimpleTypefelhasználó XmlSchemaComplexType által definiált egyszerű vagy összetett típus. Az is lehet XmlSchemaDatatype , hogy a W3C XML-sémajavaslatban definiált beépített adattípusok egyike. Az ügyfélsémában az ElementSchemaTypeCustomer elem az , XmlSchemaComplexTypeés az FirstNameLastName elemek is.XmlSchemaSimpleType

Az XML-sémák készítése témakör kód példája a XmlSchemaComplexType.Attributes gyűjteményt használta az attribútum CustomerId elemhez való hozzáadásáhozCustomer. Ez egy séma-összeállítás előtti tulajdonság. A megfelelő Post-Schema-Compilation-Infoset tulajdonság a XmlSchemaComplexType.AttributeUses gyűjtemény, amely az összetett típus összes attribútumát tartalmazza, beleértve azokat is, amelyek a típus származtatásával öröklődnek.

Lásd még