Freigeben über


XmlSchemaSet für die Schemakompilierung

Beschreibt den XmlSchemaSetCache, in dem XSD-Schemaschemas (XML Schema Definition Language) gespeichert und überprüft werden können.

Die XmlSchemaSet-Klasse

Dies XmlSchemaSet ist ein Cache, in dem XSD-Schemaschemas (XML Schema Definition Language) gespeichert und überprüft werden können.

In System.Xml Version 1.0 wurden XML-Schemas als Bibliothek von Schemas in eine XmlSchemaCollection Klasse geladen. In System.Xml Version 2.0 sind die XmlValidatingReader Klassen und die XmlSchemaCollection Klassen veraltet und wurden durch die Create Methoden und die XmlSchemaSet Klasse ersetzt.

XmlSchemaSet wurde eingeführt, um eine Reihe von Problemen zu beheben, einschließlich der Standardskompatibilität, der Leistung sowie des veralteten Microsoft XML-Data Reduced (XDR)-Schemaformats.

Es folgt ein Vergleich zwischen der XmlSchemaCollection Klasse und der XmlSchemaSet Klasse.

XmlSchemaCollection XmlSchemaSet
Unterstützt Microsoft XDR- und W3C-XML-Schemas. Unterstützt nur W3C-XML-Schemas.
Schemas werden kompiliert, wenn die Add Methode aufgerufen wird. Schemas werden nicht kompiliert, wenn die Add Methode aufgerufen wird. Dies bietet eine Leistungsverbesserung während der Erstellung der Schemabibliothek.
Jedes Schema generiert eine einzelne kompilierte Version, die zu "Schemainseln" führen kann. Daher sind alle Ein- und Importe nur innerhalb dieses Schemas festgelegt. Kompilierte Schemas generieren ein einzelnes logisches Schema, einen "Satz" von Schemas. Alle importierten Schemas innerhalb eines Schemas, die dem Satz hinzugefügt werden, werden dem Satz direkt hinzugefügt. Dies bedeutet, dass alle Typen für alle Schemas verfügbar sind.
In der Auflistung kann nur ein Schema für einen bestimmten Zielnamespace vorhanden sein. Es können mehrere Schemas für denselben Zielnamespace hinzugefügt werden, solange keine Typenkonflikte vorhanden sind.

Migrieren zum XmlSchemaSet

Das folgende Codebeispiel enthält eine Anleitung zum Migrieren zur neuen XmlSchemaSet Klasse aus der veralteten XmlSchemaCollection Klasse. Das Codebeispiel veranschaulicht die folgenden hauptunterschiede zwischen den beiden Klassen.

Nachfolgend sehen Sie das veraltete XmlSchemaCollection Codebeispiel.

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 sehen Sie das entsprechende XmlSchemaSet Codebeispiel.

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 Schemas

Schemata werden einem XmlSchemaSet mithilfe der Add-Methode von XmlSchemaSet hinzugefügt. Wenn ein Schema zu einem XmlSchemaSet hinzugefügt wird, wird es einem Zielnamespace-URI zugeordnet. Der Zielnamespace-URI kann entweder als Parameter für die Add Methode angegeben werden oder wenn kein Zielnamespace angegeben ist, verwendet der XmlSchemaSet im Schema definierte Zielnamespace.

Schemata werden mithilfe der XmlSchemaSet-Eigenschaft des Schemas aus dem XmlSchemaSet abgerufen. Die Schemas-Eigenschaft von XmlSchemaSet ermöglicht Ihnen, über die in XmlSchema enthaltenen XmlSchemaSet-Objekte zu iterieren. Die Schemas-Eigenschaft gibt entweder alle XmlSchema-Objekte zurück, die im XmlSchemaSet enthalten sind, oder, wenn ein Zielnamespace-Parameter angegeben ist, alle XmlSchema-Objekte, die zum Zielnamespace gehören. Wenn null als Zielnamespaceparameter angegeben wird, gibt die Schemas Eigenschaft alle Schemas ohne Namespace zurück.

Das folgende Beispiel fügt das books.xsd-Schema im http://www.contoso.com/books-Namespace zu einem XmlSchemaSet hinzu, ruft alle Schemas ab, die zum http://www.contoso.com/books-Namespace gehören, aus dem XmlSchemaSet, und schreibt dann diese Schemas in die Console.

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 zum Hinzufügen und Abrufen von Schemas aus einem XmlSchemaSet Objekt finden Sie in der Add Methode und in der Dokumentation zur Schemas Eigenschaftsreferenz.

Kompilieren von Schemas

Schemas in einem XmlSchemaSet werden durch die Compile-Methode des XmlSchemaSet zu einem logischen Schema zusammengefasst.

Hinweis

Im Gegensatz zur veralteten XmlSchemaCollection Klasse werden Schemas nicht kompiliert, wenn die Add Methode aufgerufen wird.

Wenn die Compile-Methode erfolgreich ausgeführt wird, wird die IsCompiled-Eigenschaft des XmlSchemaSet auf true gesetzt.

Hinweis

Die IsCompiled Eigenschaft ist nicht betroffen, wenn Schemas in der XmlSchemaSetDatei bearbeitet werden. Aktualisierungen der einzelnen Schemas in den XmlSchemaSet werden nicht nachverfolgt. Daher kann die IsCompiled Eigenschaft auch dann sein true , wenn eines der in der XmlSchemaSet Datei enthaltenen Schemas geändert wurde, solange keine Schemas hinzugefügt oder daraus XmlSchemaSetentfernt wurden.

Im folgenden Beispiel wird die books.xsd Datei zu XmlSchemaSet hinzugefügt und dann die 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 zum Kompilieren von Schemas in einer XmlSchemaSetMethode finden Sie in der Compile Methodenreferenzdokumentation.

Neuverarbeitungsschemas

Durch erneutes Verarbeiten eines Schemas in einem XmlSchemaSet werden alle Vorverarbeitungsschritte ausgeführt, die auf ein Schema angewendet werden, wenn die Add Methode von XmlSchemaSet aufgerufen wird. Wenn der Aufruf der Reprocess-Methode erfolgreich ist, wird die IsCompiled-Eigenschaft des XmlSchemaSet-Objekts auf false gesetzt.

Die Reprocess Methode sollte verwendet werden, wenn ein Schema in der XmlSchemaSet Datei geändert wurde, nachdem die XmlSchemaSet Kompilierung durchgeführt wurde.

Im folgenden Beispiel wird die erneute Verarbeitung eines Schemas veranschaulicht, das zu XmlSchemaSet hinzugefügt und mit der Reprocess Methode bearbeitet wurde. Nachdem XmlSchemaSet mithilfe der Compile Methode kompiliert wird und das Schema, das zu XmlSchemaSet hinzugefügt wurde, modifiziert wird, wird die IsCompiled Eigenschaft auf true festgelegt, obwohl ein Schema in der XmlSchemaSet geändert wurde. Durch das Aufrufen der Reprocess Methode werden alle Vorverarbeitungen, die von der Add Methode ausgeführt werden, übernommen, 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.

Überprüfung eines Schemas

Sie können die Contains Methode der XmlSchemaSet verwenden, um zu überprüfen, ob ein Schema in einem XmlSchemaSet enthalten ist. Die Contains-Methode sucht entweder nach einem Zielnamespace oder einem XmlSchema-Objekt. In beiden Fällen gibt die Methode Containstrue zurück, wenn das Schema in der XmlSchemaSet enthalten ist; andernfalls gibt sie false zurück.

Weitere Informationen zum Überprüfen auf ein Schema finden Sie in der Contains Referenzdokumentation zur 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, während die RemoveRecursive Methode das angegebene Schema und alle Schemata entfernt, die es importiert, aus dem XmlSchemaSet.

Das folgende Beispiel veranschaulicht das Hinzufügen mehrerer Schemas zu einem XmlSchemaSetSchema und dann die Verwendung der RemoveRecursive Methode, um eines der Schemas und alle importierten Schemas zu entfernen.

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 zum Entfernen von Schemas aus einem XmlSchemaSet finden Sie in der Referenzdokumentation zu Remove- und RemoveRecursive-Methoden.

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 eine XmlSchemaSet , die mehrere Schemas für den http://www.contoso.com Namespace enthält. Ein Schema mit der folgenden xs:import Direktive wird dem XmlSchemaSetHinzugefügt.

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

Die XmlSchemaSet versucht, ein Schema für den http://www.contoso.com Namespace zu importieren, indem es aus der http://www.contoso.com/schema.xsd URL geladen wird. Nur die Deklaration und Typen, die im Schemadokument deklariert sind, sind im Importschema verfügbar, obwohl es andere Schemadokumente für den http://www.contoso.com-Namespace in der XmlSchemaSet gibt. Wenn die schema.xsd Datei nicht unter der http://www.contoso.com/schema.xsd URL gespeichert werden kann, wird kein Schema für den http://www.contoso.com Namespace in das Importschema importiert.

Überprüfen von XML-Dokumenten

XML-Dokumente können anhand von Schemata in einem XmlSchemaSet validiert werden. Sie überprüfen ein XML-Dokument, indem Sie der XmlSchemaSetSchemas Eigenschaft eines XmlReaderSettings Objekts ein Schema hinzufügen oder ein XmlSchemaSet zur Schemas Eigenschaft eines XmlReaderSettings Objekts hinzufügen. Das XmlReaderSettings Objekt wird dann von der Create Methode der XmlReader Klasse verwendet, um ein XmlReader Objekt zu erstellen und das XML-Dokument zu überprüfen.

Weitere Informationen zur Validierung von XML-Dokumenten mithilfe eines XmlSchemaSet finden Sie unter XML-Schema (XSD) Validierung mit XmlSchemaSet.

Siehe auch