"XmlSchemaSet" zur Kompilierung von Schemata
Beschreibt das XmlSchemaSet, bei dem es sich um einen Cache handelt, in dem XSD-Schemata (XML Schema Definition Language) gespeichert und validiert werden können.
Die XmlSchemaSet-Klasse
Beim XmlSchemaSet handelt es sich um einen Cache, in dem XSD-Schemata (XML Schema Definition Language) gespeichert und validiert werden können.
In System.Xml, Version 1.0, wurden XML-Schemata als Schemabibliothek in eine XmlSchemaCollection-Klasse geladen.In System.Xml, Version 2.0, sind die XmlValidatingReader-Klasse und die XmlSchemaCollection-Klasse veraltet und wurden durch die Create-Methoden bzw. die XmlSchemaSet-Klasse ersetzt.
Das XmlSchemaSet wurde eingeführt, um eine Reihe von Problemen einschließlich der Kompatibilität mit Standards, der Leistungsfähigkeit und des veralteten Microsoft XDR-Schemaformats (XML-Data Reduced) zu beheben.
Es folgt ein Vergleich zwischen der XmlSchemaCollection-Klasse und der XmlSchemaSet-Klasse.
XmlSchemaCollection |
XmlSchemaSet |
---|---|
Unterstützt Microsoft XDR-Schemata und XML-Schemata des W3C. |
Unterstützt nur XML-Schemata des W3C. |
Die Schemata werden beim Aufrufen der Add-Methode kompiliert. |
Die Schemata werden beim Aufrufen der Add-Methode nicht kompiliert.Dadurch wird die Leistungsfähigkeit während der Erstellung der Schemabibliothek erhöht. |
Von jedem Schema wird eine einzelne kompilierte Version erstellt, was zu "Schemainseln" führen kann. Folglich werden alle Includes und Importe nur innerhalb dieses Schemas zugeordnet. |
Kompilierte Schemata erstellen ein einzelnes logisches Schema, eine "Gruppe" von Schemata.Alle importierten Schemata innerhalb eines Schemas, die der Gruppe hinzugefügt werden, werden der Gruppe selbst direkt hinzugefügt.Daher sind alle Typen für alle Schemata verfügbar. |
Es kann nur ein Schema für einen bestimmten Zielnamespace in der Auflistung vorhanden sein. |
Es können mehrere Schemata für denselben Zielnamespace hinzugefügt werden, wenn keine Typenkonflikte auftreten. |
Migrieren zum "XmlSchemaSet"
Im folgenden Codebeispiel ist eine Anleitung zum Migrieren aus der veralteten XmlSchemaCollection-Klasse zur neuen XmlSchemaSet-Klasse enthalten.Im Codebeispiel werden die folgenden Hauptunterschiede zwischen den beiden Klassen veranschaulicht.
Im Gegensatz zur Add-Methode der XmlSchemaCollection-Klasse werden die Schemata beim Aufrufen der Add-Methode von XmlSchemaSet nicht kompiliert.Die Compile-Methode von XmlSchemaSet wird im Beispielcode explizit aufgerufen.
Wenn Sie ein XmlSchemaSet durchlaufen möchten, verwenden Sie die Schemas-Eigenschaft des XmlSchemaSet.
Nachfolgend ist ein Beispiel des veralteten XmlSchemaCollection-Codes angegeben.
Dim schemaCollection As XmlSchemaCollection = New XmlSchemaCollection()
schemaCollection.Add("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd")
schemaCollection.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd")
Dim schema As XmlSchema
For Each schema in schemaCollection
Console.WriteLine(schema.TargetNamespace)
Next
XmlSchemaCollection schemaCollection = new XmlSchemaCollection();
schemaCollection.Add("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd");
schemaCollection.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd");
foreach(XmlSchema schema in schemaCollection)
{
Console.WriteLine(schema.TargetNamespace);
}
Nachfolgend ist ein Beispiel des entsprechenden XmlSchemaSet-Codes angegeben.
Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
schemaSet.Add("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd")
schemaSet.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd")
schemaSet.Compile()
Dim schema As XmlSchema
For Each schema in schemaSet.Schemas()
Console.WriteLine(schema.TargetNamespace)
Next
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd");
schemaSet.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd");
schemaSet.Compile();
foreach(XmlSchema schema in schemaSet.Schemas())
{
Console.WriteLine(schema.TargetNamespace);
}
Hinzufügen und Abrufen von Schemata
Schemata werden einem XmlSchemaSet mithilfe der Add-Methode von XmlSchemaSet hinzugefügt.Wenn ein Schema einem XmlSchemaSet hinzugefügt wird, wird es einem Namespace-URI zugeordnet.Der Zielnamespace-URI kann als Parameter für die Add-Methode angegeben werden. Wenn kein Namespace angegeben wurde, verwendet das XmlSchemaSet den im Schema angegebenen Zielnamespace.
Schemata werden mithilfe der Schemas-Eigenschaft des XmlSchemaSet aus dem XmlSchemaSet abgerufen.Mit der Schemas-Eigenschaft des XmlSchemaSet können Sie die im XmlSchemaSet enthaltenen XmlSchema-Objekte durchlaufen.Die Schemas-Eigenschaft gibt entweder alle imXmlSchemaSet enthaltenen XmlSchema-Objekte zurück. Ansonsten, wenn ein Parameter für den Zielnamespace angegeben wurde, werden alle zu diesem Zielnamespace gehörenden XmlSchema-Objekte zurückgegeben.Wenn null als Parameter für den Zielnamespace angegeben wurde, gibt die Schemas-Eigenschaft alle Schemata ohne Namespace zurück.
Im folgenden Beispiel wird einem XmlSchemaSet das books.xsd-Schema im https://www.contoso.com/books-Namespace hinzugefügt. Außerdem werden alle Schemas, die zum https://www.contoso.com/books-Namespace gehören, aus dem XmlSchemaSet abgerufen und in die Console geschrieben.
Dim schemaSet As XmlSchemaSet = New XmlSchemaSet
schemaSet.Add("https://www.contoso.com/books", "books.xsd")
Dim schema As XmlSchema
For Each schema In schemaSet.Schemas("https://www.contoso.com/books")
schema.Write(Console.Out)
Next
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add("https://www.contoso.com/books", "books.xsd");
foreach (XmlSchema schema in schemaSet.Schemas("https://www.contoso.com/books"))
{
schema.Write(Console.Out);
}
Weitere Informationen über das Hinzufügen und Abrufen von Schemata aus einem XmlSchemaSet-Objekt finden Sie in der Referenzdokumentation zur Add-Methode und zur Schemas-Eigenschaft.
Kompilieren von Schemata
In einem XmlSchemaSet befindliche Schemata werden von der Compile-Methode des XmlSchemaSet in ein logisches Schema kompiliert.
Hinweis |
---|
Im Gegensatz zur veralteten XmlSchemaCollection-Klasse werden die Schemata beim Aufrufen der Add-Methode nicht kompiliert. |
Wenn die Compile-Methode erfolgreich ausgeführt wird, wird die IsCompiled-Eigenschaft des XmlSchemaSet auf true festgelegt.
Hinweis |
---|
Die IsCompiled-Eigenschaft wird nicht beeinflusst, wenn Schemata im XmlSchemaSet bearbeitet werden.Updates der einzelnen Schemata im XmlSchemaSet werden nicht nachverfolgt.Folglich kann die IsCompiled-Eigenschaft true sein, obwohl eines der im XmlSchemaSet enthaltenen Schemata veraltet ist, wenn keine Schemata aus dem XmlSchemaSet hinzugefügt oder entfernt wurden. |
Im folgenden Beispiel wird die books.xsd-Datei dem XmlSchemaSet hinzugefügt und anschließend eine Compile-Methode aufgerufen.
Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
schemaSet.Add("https://www.contoso.com/books", "books.xsd")
schemaSet.Compile()
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add("https://www.contoso.com/books", "books.xsd");
schemaSet.Compile();
Weitere Informationen über das Kompilieren von Schemata in einem XmlSchemaSet finden Sie in der Referenzdokumentation zur Compile-Methode.
Wiederverarbeiten von Schemata
Beim Wiederverarbeiten eines Schemas in einem XmlSchemaSet werden alle Wiederverarbeitungsschritte durchgeführt, die beim Aufrufen der Add-Methode des XmlSchemaSet für ein Schema durchgeführt werden.Wenn die Reprocess-Methode erfolgreich aufgerufen wurde, wird die IsCompiled-Eigenschaft des XmlSchemaSet auf false festgelegt.
Die Reprocess-Methode sollte verwendet werden, wenn ein Schema im XmlSchemaSet geändert wurde, nachdem von XmlSchemaSet die Kompilierung durchgeführt wurde.
Im folgenden Beispiel wird die Wiederverarbeitung eines Schemas dargestellt, das dem XmlSchemaSet mithilfe der Reprocess-Methode hinzugefügt wurde.Nachdem das XmlSchemaSet mithilfe der Compile-Methode kompiliert und das dem XmlSchemaSet hinzugefügte Schema geändert wurde, wird die IsCompiled-Eigenschaft auf true festgelegt, obwohl ein Schema im XmlSchemaSet geändert wurde.Beim Aufrufen der Reprocess-Methode werden alle von der Add-Methode durchgeführten Wiederverarbeitungsschritte ausgeführt, und die IsCompiled-Eigenschaft wird auf false festgelegt.
Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
Dim schema As XmlSchema = schemaSet.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd")
schemaSet.Compile()
Dim element As XmlSchemaElement = New XmlSchemaElement()
schema.Items.Add(element)
element.Name = "book"
element.SchemaTypeName = New XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema")
schemaSet.Reprocess(schema)
XmlSchemaSet schemaSet = new XmlSchemaSet();
XmlSchema schema = schemaSet.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd");
schemaSet.Compile();
XmlSchemaElement element = new XmlSchemaElement();
schema.Items.Add(element);
element.Name = "book";
element.SchemaTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema");
schemaSet.Reprocess(schema);
Weitere Informationen über das Wiederverarbeiten eines Schemas in einem XmlSchemaSet finden Sie in der Referenzdokumentation zur Reprocess-Methode.
Suche nach einem Schema
Sie können die Contains-Methode des XmlSchemaSet verwenden, um festzustellen ob in einem XmlSchemaSet ein Schema enthalten ist.Die Contains-Methode sucht entweder nach einem Zielnamespace oder einem XmlSchema-Objekt.In beiden Fällen gibt die Contains-Methode true zurück, wenn im XmlSchemaSet ein Schema enthalten ist. Andernfalls gibt sie false zurück.
Weitere Informationen über das Suchen nach einem Schema finden Sie in der Referenzdokumentation zur Contains-Methode.
Entfernen von Schemata
Schemata werden mithilfe der Remove-Methode und der RemoveRecursive-Methode des XmlSchemaSet aus einem XmlSchemaSet entfernt.Die Remove-Methode entfernt das angegebene Schema aus dem XmlSchemaSet, wohingegen die RemoveRecursive-Methode das angegebene Schema und alle aus dem XmlSchemaSet importierten Schemata entfernt.
Im folgenden Beispiel wird das Hinzufügen mehrerer Schemata zu einem XmlSchemaSet und die anschließende Verwendung der RemoveRecursive-Methode zum Entfernen eines der Schemata und aller von ihr importierten Schemata veranschaulicht.
Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
schemaSet.Add("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd")
schemaSet.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd")
schemaSet.Add("https://www.contoso.com/music", "https://www.contoso.com/music.xsd")
Dim schema As XmlSchema
For Each schema In schemaSet.Schemas()
If schema.TargetNamespace = "https://www.contoso.com/music" Then
schemaSet.RemoveRecursive(schema)
End If
Next
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd");
schemaSet.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd");
schemaSet.Add("https://www.contoso.com/music", "https://www.contoso.com/music.xsd");
foreach (XmlSchema schema in schemaSet.Schemas())
{
if (schema.TargetNamespace == "https://www.contoso.com/music")
{
schemaSet.RemoveRecursive(schema);
}
}
Weitere Informationen über das Entfernen von Schemata aus einem XmlSchemaSet finden Sie in der Referenzdokumentation zur Remove-Methode und zur RemoveRecursive-Methode.
Schemaauflösung und "xs:import"
In den folgenden Beispielen wird die Verhaltensweise des XmlSchemaSet beim Importieren von Schemata beschrieben, wenn in einem XmlSchemaSet mehrere Schemata für einen angegebenen Namespace vorhanden sind.
Betrachten Sie beispielsweise ein XmlSchemaSet, das mehrere Schemata für den http://www.contoso.com-Namespace enthält.Ein Schema mit der folgenden xs:import-Richtlinie wird dem XmlSchemaSet hinzugefügt.
<xs:import namespace="https://www.contoso.com" schemaLocation="https://www.contoso.com/schema.xsd" />
Das XmlSchemaSet versucht, ein Schema für den http://www.contoso.com-Namespace durch Laden aus der URL https://www.contoso.com/schema.xsd zu importieren.Im Importschema sind nur die Schemadeklaration und die im Schemadokument deklarierten Typen verfügbar, obwohl im XmlSchemaSet andere Schemadokumente für den http://www.contoso.com-Namespace vorhanden sind.Wenn die schema.xsd-Datei nicht unter der URL https://www.contoso.com/schema.xsd gefunden werden kann, wird kein Schema für den http://www.contoso.com-Namespace in das Importschema importiert.
Validierung von XML-Dokumenten
XML-Dokumente können anhand von Schemata in einem XmlSchemaSet validiert werden.Sie validieren ein XML-Dokument, indem Sie der XmlSchemaSetSchemas-Eigenschaft eines XmlReaderSettings-Objekts ein Schema hinzufügen oder indem Sie der Schemas-Eigenschaft eines XmlReaderSettings-Objekts ein XmlSchemaSet hinzufügen.Das XmlReaderSettings-Objekt wird anschließend von der Create-Methode der XmlReader-Klasse verwendet, um ein XmlReader-Objekt zu erstellen und um das XML-Dokument zu validieren.
Weitere Informationen über das Validieren von XML-Dokumenten mithilfe eines XmlSchemaSet finden Sie unter Validierung eines XML-Schemas (XSD) mit "XmlSchemaSet".