"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.
Jedes Schema generiert eine einzelne kompilierte Version, die zu „Schemainseln“ führen kann. Als Ergebnis werden alle Includes und Importe nur innerhalb dieses Schemas bewertet. 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 von der veralteten XmlSchemaCollection-Klasse zur neuen XmlSchemaSet-Klasse enthalten. Im Codebeispiel werden die folgenden Hauptunterschiede zwischen den beiden Klassen veranschaulicht.

Nachfolgend ist ein Beispiel des veralteten XmlSchemaCollection-Codes angegeben.

Dim schemaCollection As XmlSchemaCollection = New XmlSchemaCollection()  
schemaCollection.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd")  
schemaCollection.Add("http://www.contoso.com/books", "http://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("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd");  
schemaCollection.Add("http://www.contoso.com/books", "http://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("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd")  
schemaSet.Add("http://www.contoso.com/books", "http://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("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd");  
schemaSet.Add("http://www.contoso.com/books", "http://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 XmlSchemaSet-Eigenschaft des Schemas aus dem XmlSchemaSet abgerufen. Mit der Schemas-Eigenschaft des XmlSchemaSet können Sie die im XmlSchema enthaltenen XmlSchemaSet-Objekte durchlaufen. Die Schemas-Eigenschaft gibt entweder alle imXmlSchema enthaltenen XmlSchemaSet-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 books.xsd das http://www.contoso.com/books-Schema im XmlSchemaSet-Namespace hinzugefügt. Außerdem werden alle Schemas, die zum http://www.contoso.com/books-Namespace gehören, aus dem XmlSchemaSet abgerufen und in die Console geschrieben.

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet  
schemaSet.Add("http://www.contoso.com/books", "books.xsd")  
  
Dim schema As XmlSchema  
  
For Each schema In schemaSet.Schemas("http://www.contoso.com/books")  
  
   schema.Write(Console.Out)  
  
Next  
XmlSchemaSet schemaSet = new XmlSchemaSet();  
schemaSet.Add("http://www.contoso.com/books", "books.xsd");  
  
foreach (XmlSchema schema in schemaSet.Schemas("http://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("http://www.contoso.com/books", "books.xsd")  
schemaSet.Compile()  
XmlSchemaSet schemaSet = new XmlSchemaSet();  
schemaSet.Add("http://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("http://www.contoso.com/books", "http://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("http://www.contoso.com/books", "http://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 XmlSchemaSet-Methode und der Remove-Methode des RemoveRecursive 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("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd")  
schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd")  
schemaSet.Add("http://www.contoso.com/music", "http://www.contoso.com/music.xsd")  
  
Dim schema As XmlSchema  
  
For Each schema In schemaSet.Schemas()  
  
   If schema.TargetNamespace = "http://www.contoso.com/music" Then  
      schemaSet.RemoveRecursive(schema)  
   End If  
  
Next  
XmlSchemaSet schemaSet = new XmlSchemaSet();  
schemaSet.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd");  
schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd");  
schemaSet.Add("http://www.contoso.com/music", "http://www.contoso.com/music.xsd");  
  
foreach (XmlSchema schema in schemaSet.Schemas())  
{  
   if (schema.TargetNamespace == "http://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-Anweisung wird dem XmlSchemaSet hinzugefügt.

<xs:import namespace="http://www.contoso.com" schemaLocation="http://www.contoso.com/schema.xsd" />  

Das XmlSchemaSet versucht, ein Schema für den http://www.contoso.com-Namespace durch Laden aus der URL http://www.contoso.com/schema.xsd zu importieren. Im Importschema sind nur die Schemadeklaration und die im Schemadokument deklarierten Typen verfügbar, obwohl im http://www.contoso.com andere Schemadokumente für den XmlSchemaSet-Namespace vorhanden sind. Wenn die schema.xsd-Datei nicht unter der URL http://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 eine XmlSchemaSet-Klasse 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 zum Validieren von XML-Dokumenten mithilfe einer XmlSchemaSet-Klasse finden Sie unter Validierung eines XML-Schemas (XSD) mit „XmlSchemaSet“.

Siehe auch