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.
In tegenstelling tot de Add methode van de XmlSchemaCollection klasse worden schema's niet gecompileerd bij het aanroepen van de Add methode van de XmlSchemaSetklasse. De Compile methode van de code XmlSchemaSet wordt expliciet aangeroepen in de voorbeeldcode.
Als u een XmlSchemaSetbewerking wilt herhalen, moet u de Schemas eigenschap van de XmlSchemaSet.
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 false
de 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.