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.
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.
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.
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.
Lekéri az elem összetett típusát az
Customer
XmlSchemaComplexType osztály használatával.Ha az összetett típus rendelkezik attribútumokkal, a rendszer számba veszi IDictionaryEnumerator azokat XmlSchemaAttribute , és a nevét a konzolra írja.
Lekéri a komplex típusú sorozatrészecskét az XmlSchemaSequence osztály használatával.
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 FirstName
LastName
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.