Delen via


XmlSchemaSet voor schemacompilatie

Beschrijft de XmlSchemaSet, een cache waarin XSD-schema's (XML Schema Definition Language) kunnen worden opgeslagen en gevalideerd.

De klasse XmlSchemaSet

Het XmlSchemaSet is een cache waarin XSD-schema's (XML Schema Definition Language) kunnen worden opgeslagen en gevalideerd.

In System.Xml versie 1.0 zijn XML-schema's in een XmlSchemaCollection klasse geladen als een bibliotheek met schema's. In System.Xml versie 2.0 zijn de XmlValidatingReader en de XmlSchemaCollection klassen verouderd en vervangen door respectievelijk de Create methoden en de XmlSchemaSet klasse.

Het XmlSchemaSet is geïntroduceerd om een aantal problemen op te lossen, waaronder standaardencompatibiliteit, prestaties en de verouderde XDR-schema-indeling (Microsoft XML-Data Reduced).

Hier volgt een vergelijking tussen de XmlSchemaCollection klasse en de XmlSchemaSet klasse.

XmlSchemaCollection XmlSchemaSet
Ondersteunt Microsoft XDR- en W3C XML-schema's. Ondersteunt alleen W3C XML-schema's.
Schema's worden gecompileerd wanneer de Add methode wordt aangeroepen. Schema's worden niet gecompileerd wanneer de Add methode wordt aangeroepen. Dit biedt een prestatieverbetering tijdens het maken van de schemabibliotheek.
Elk schema genereert een afzonderlijke gecompileerde versie die kan resulteren in 'schemaeilanden'. Als gevolg hiervan zijn alle insluitingen en importen alleen binnen dat schema opgenomen. Gecompileerde schema's genereren één logisch schema, een set schema's. Geïmporteerde schema's in een schema dat aan de set worden toegevoegd, worden rechtstreeks aan de set zelf toegevoegd. Dit betekent dat alle typen beschikbaar zijn voor alle schema's.
Er kan slechts één schema voor een bepaalde doelnaamruimte bestaan in de verzameling. Meerdere schema's voor dezelfde doelnaamruimte kunnen worden toegevoegd zolang er geen typeconflicten zijn.

Migreren naar de XmlSchemaSet

Het volgende codevoorbeeld bevat een handleiding voor het migreren naar de nieuwe XmlSchemaSet klasse van de verouderde XmlSchemaCollection klasse. Het codevoorbeeld illustreert de volgende belangrijke verschillen tussen de twee klassen.

Hier volgt het verouderde XmlSchemaCollection codevoorbeeld.

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);  
}  

Hier volgt het equivalente XmlSchemaSet codevoorbeeld.

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);  
}  

Schema's toevoegen en ophalen

Schema's worden toegevoegd aan een XmlSchemaSet met behulp van de Add methode van de XmlSchemaSet. Wanneer een schema wordt toegevoegd aan een XmlSchemaSetschema, wordt het gekoppeld aan een doelnaamruimte-URI. De doelnaamruimte-URI kan worden opgegeven als parameter voor de Add methode of als er geen doelnaamruimte is opgegeven, wordt de XmlSchemaSet doelnaamruimte gebruikt die in het schema is gedefinieerd.

Schema's worden opgehaald uit een XmlSchemaSet met behulp van de Schemas eigenschap van de XmlSchemaSet. Met Schemas de eigenschap van het XmlSchemaSet object kunt u de XmlSchema objecten in het XmlSchemaSetobject herhalen. De Schemas eigenschap retourneert alle XmlSchema objecten in de XmlSchemaSet, of retourneert op basis van een doelnaamruimteparameter alle XmlSchema objecten die deel uitmaken van de doelnaamruimte. Als null wordt opgegeven als de parameter voor de doelnaamruimte, retourneert de Schemas eigenschap alle schema's zonder een naamruimte.

In het volgende voorbeeld wordt het books.xsd schema in de http://www.contoso.com/books naamruimte toegevoegd aan een XmlSchemaSet, worden alle schema's opgehaald die deel uitmaken van de http://www.contoso.com/books naamruimte uit de XmlSchemaSeten worden deze schema's vervolgens naar de 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);  
}  

Zie de Add methode en de Schemas referentiedocumentatie voor eigenschappen voor meer informatie over het toevoegen en ophalen van schema's uit een XmlSchemaSet object.

Schema's compileren

Schema's in een XmlSchemaSet worden gecompileerd in één logisch schema door de Compile methode van de XmlSchemaSet.

Notitie

In tegenstelling tot de verouderde XmlSchemaCollection klasse worden schema's niet gecompileerd wanneer de Add methode wordt aangeroepen.

Als de Compile methode wordt uitgevoerd, wordt de IsCompiled eigenschap van de XmlSchemaSet methode ingesteld op true.

Notitie

De IsCompiled eigenschap wordt niet beïnvloed als schema's worden bewerkt in de XmlSchemaSet. Updates van de afzonderlijke schema's in de schema's XmlSchemaSet worden niet bijgehouden. Als gevolg hiervan kan de IsCompiled eigenschap ook zijn true als een van de schema's in de eigenschap XmlSchemaSet is gewijzigd, zolang er geen schema's zijn toegevoegd of verwijderd uit de XmlSchemaSet.

In het volgende voorbeeld wordt het books.xsd bestand aan het XmlSchemaSet bestand toegevoegd en vervolgens de Compile methode aangeroepen.

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();  

Zie de Compile referentiedocumentatie voor methoden voor meer informatie over het compileren van schema's in eenXmlSchemaSet.

Schema's voor opnieuw verwerken

Als u een schema opnieuw verwerkt in een XmlSchemaSet schema, worden alle voorverwerkingsstappen uitgevoerd die in een schema worden uitgevoerd wanneer de Add methode van de XmlSchemaSet aangeroepen methode wordt aangeroepen. Als de aanroep van de Reprocess methode is geslaagd, wordt de IsCompiled eigenschap van de XmlSchemaSet methode ingesteld op false.

De Reprocess methode moet worden gebruikt wanneer een schema in het XmlSchemaSet schema is gewijzigd nadat de XmlSchemaSet compilatie is uitgevoerd.

Het volgende voorbeeld illustreert het opnieuw verwerken van een schema dat aan de XmlSchemaSetReprocess methode is toegevoegd. Nadat de XmlSchemaSet methode is gecompileerd Compile en het schema dat aan de XmlSchemaSet methode is toegevoegd, wordt de IsCompiled eigenschap ingesteld true op ondanks dat een schema in het XmlSchemaSet schema is gewijzigd. Als u de Reprocess methode aanroept, wordt alle voorverwerking uitgevoerd door de Add methode en wordt de IsCompiled eigenschap ingesteld op false.

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);  

Zie de Reprocess referentiedocumentatie voor methoden voor meer informatie over het opnieuw verwerken van een schema in een XmlSchemaSetschema.

Controleren op een schema

U kunt de Contains methode van de XmlSchemaSet methode gebruiken om te controleren of een schema zich in een XmlSchemaSetschema bevindt. De Contains methode gebruikt een doelnaamruimte of een XmlSchema object om op te controleren. In beide gevallen retourneert true de Contains methode als het schema is opgenomen in de XmlSchemaSet; anders retourneert falsede methode .

Zie de referentiedocumentatie voor methoden Contains voor meer informatie over het controleren op een schema.

Schema's verwijderen

Schema's worden verwijderd uit een XmlSchemaSet met behulp van de Remove en RemoveRecursive methoden van de XmlSchemaSet. De Remove methode verwijdert het opgegeven schema uit de XmlSchemaSet, terwijl de RemoveRecursive methode het opgegeven schema verwijdert en alle schema's die het importeert uit de XmlSchemaSet.

In het volgende voorbeeld ziet u hoe u meerdere schema's toevoegt aan een XmlSchemaSetschema en vervolgens met behulp van de RemoveRecursive methode een van de schema's en alle schema's verwijdert die worden geïmporteerd.

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);  
   }  
}  

Zie de Remove referentiedocumentatie en RemoveRecursive methoden voor meer informatie over het verwijderen van schema's uit een XmlSchemaSetschema.

Schemaresolutie en xs:import

In de volgende voorbeelden wordt het gedrag voor het XmlSchemaSet importeren van schema's beschreven wanneer er meerdere schema's voor een bepaalde naamruimte bestaan in een XmlSchemaSet.

Denk bijvoorbeeld aan een XmlSchemaSet schema dat meerdere schema's voor de http://www.contoso.com naamruimte bevat. Er wordt een schema met de volgende xs:import richtlijn toegevoegd aan de XmlSchemaSet.

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

De XmlSchemaSet pogingen om een schema voor de http://www.contoso.com naamruimte te importeren door het vanuit de http://www.contoso.com/schema.xsd URL te laden. Alleen de schemadeclaratie en typen die in het schemadocument zijn gedeclareerd, zijn beschikbaar in het importschema, ook al zijn er andere schemadocumenten voor de http://www.contoso.com naamruimte in de XmlSchemaSet. Als het schema.xsd bestand zich niet op de http://www.contoso.com/schema.xsd URL kan bevinden, wordt er geen schema voor de http://www.contoso.com naamruimte geïmporteerd in het importschema.

XML-documenten valideren

XML-documenten kunnen worden gevalideerd op basis van schema's in een XmlSchemaSet. U valideert een XML-document door een schema toe te voegen aan de XmlSchemaSetSchemas eigenschap van een XmlReaderSettings object of door een XmlSchemaSet aan de Schemas eigenschap van een XmlReaderSettings object toe te voegen. Het XmlReaderSettings object wordt vervolgens gebruikt door de Create methode van de XmlReader klasse om een XmlReader object te maken en het XML-document te valideren.

Zie XML-schemavalidatie (XSD) met XmlSchemaSet voor meer informatie over het valideren van XML-documenten met behulp van een XmlSchemaSetXML-schema.

Zie ook