XmlSchemaSet pro kompilaci schématu
Popisuje XmlSchemaSetmezipaměť, ve které lze uložit a ověřit schémata jazyka XSD (XML Schema Definition Language).
XmlSchemaSet – třída
Jedná se XmlSchemaSet o mezipaměť, ve které lze ukládat a ověřovat schémata jazyka XSD (XML Schema Definition Language).
Ve System.Xml verzi 1.0 byly schémata XML načtena do XmlSchemaCollection třídy jako knihovna schémat. Ve System.Xml verzi 2.0 XmlValidatingReader jsou třídy XmlSchemaCollection zastaralé a byly nahrazeny metodami Create a XmlSchemaSet třídou v uvedeném pořadí.
Zavedli XmlSchemaSet jsme opravu řady problémů, včetně kompatibility standardů, výkonu a zastaralého formátu schématu XDR (Microsoft XML-Data Reduced).
Následuje porovnání mezi XmlSchemaCollection třídou a XmlSchemaSet třídou.
Xmlschemacollection | Xmlschemaset |
---|---|
Podporuje schémata MICROSOFT XDR a W3C XML. | Podporuje pouze schémata XML W3C. |
Schémata jsou zkompilována při Add zavolání metody. | Schémata nejsou kompilována při Add zavolání metody. To poskytuje zlepšení výkonu při vytváření knihovny schémat. |
Každé schéma generuje jednotlivou zkompilovanou verzi, která může vést k "ostrůvkům schématu". V důsledku toho jsou všechny zahrnutí a importy vymezeny pouze v rámci tohoto schématu. | Kompilovaná schémata generují jedno logické schéma, "sadu" schémat. Všechna importovaná schémata v rámci schématu přidaného do sady se přímo přidají do samotné sady. To znamená, že všechny typy jsou k dispozici pro všechna schémata. |
V kolekci může existovat pouze jedno schéma pro konkrétní cílový obor názvů. | Více schémat pro stejný cílový obor názvů lze přidat, pokud neexistují žádné konflikty typů. |
Migrace na XmlSchemaSet
Následující příklad kódu obsahuje průvodce migrací na novou XmlSchemaSet třídu z zastaralé XmlSchemaCollection třídy. Příklad kódu znázorňuje následující hlavní rozdíly mezi těmito dvěma třídami.
Add Na rozdíl od metody XmlSchemaCollection třídy nejsou schémata kompilována při volání Add metody XmlSchemaSet. Metoda CompileXmlSchemaSet je explicitně volána v ukázkovém kódu.
Chcete-li iterovat přes XmlSchemaSet, musíte použít Schemas vlastnost XmlSchemaSet.
Následuje příklad zastaralého XmlSchemaCollection kódu.
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);
}
Následuje ekvivalentní XmlSchemaSet příklad kódu.
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);
}
Přidávání a načítání schémat
Schémata jsou přidána do XmlSchemaSet pomocí Add metody XmlSchemaSet. Při přidání schématu do objektu XmlSchemaSetje přidruženo k identifikátoru URI cílového oboru názvů. Identifikátor URI cílového oboru názvů lze buď zadat jako parametr Add metody, nebo pokud není zadán žádný cílový obor názvů, XmlSchemaSet použije cílový obor názvů definovaný ve schématu.
Schémata se načítají z XmlSchemaSet vlastnosti SchemasXmlSchemaSet. Vlastnost SchemasXmlSchemaSet umožňuje iterovat nad XmlSchema objekty obsažené v objektu XmlSchemaSet. Vlastnost Schemas buď vrátí všechny XmlSchema objekty obsažené v objektu XmlSchemaSet, nebo vzhledem k cílovému parametru oboru názvů vrátí všechny XmlSchema objekty, které patří do cílového oboru názvů. Pokud null
je zadán jako parametr cílového oboru názvů, Schemas vrátí vlastnost všechna schémata bez oboru názvů.
Následující příklad přidá books.xsd
schéma v http://www.contoso.com/books
oboru názvů do XmlSchemaSet, načte všechna schémata, která patří do http://www.contoso.com/books
oboru názvů z XmlSchemaSeta pak zapíše tato schémata do 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);
}
Další informace o přidávání a načítání schémat z objektu XmlSchemaSet naleznete Add v metodě a Schemas referenční dokumentaci k vlastnosti.
Kompilace schémat
Schémata v objektu XmlSchemaSet jsou zkompilována do jednoho logického schématu Compile metodou XmlSchemaSet.
Poznámka:
Na rozdíl od zastaralé XmlSchemaCollection třídy nejsou schémata při zavolání metody zkompilována Add .
Pokud se Compile metoda úspěšně provede, IsCompiled vlastnost objektu XmlSchemaSet je nastavena na true
hodnotu .
Poznámka:
Vlastnost IsCompiled není ovlivněna, pokud jsou schémata upravena v režimu XmlSchemaSet. Aktualizace jednotlivých schémat nejsou XmlSchemaSet sledována. V důsledku toho může být true
vlastnost i v případě, IsCompiled že některá ze schémat obsažených v objektu XmlSchemaSet byla změněna, pokud nebyla přidána nebo odebrána žádná schémata z objektu XmlSchemaSet.
Následující příklad přidá books.xsd
soubor do XmlSchemaSet a pak zavolá metodu Compile .
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();
Další informace o kompilaci schémat v referenční XmlSchemaSetCompile dokumentaci k metodě.
Opětovné zpracování schémat
Opětovné zpracování schématu XmlSchemaSet ve schématu provede všechny kroky předběžného zpracování provedené ve schématu při Add zavolání metody XmlSchemaSet . Pokud volání Reprocess metody je úspěšné, IsCompiled vlastnost je nastavena XmlSchemaSet na false
.
Metoda Reprocess by se měla použít, když bylo změněno schéma po XmlSchemaSetXmlSchemaSet provedení kompilace.
Následující příklad ukazuje opětovné zpracování schématu přidaného XmlSchemaSet do metody.Reprocess Po kompilaci XmlSchemaSet pomocí Compile metody a schéma přidané do je XmlSchemaSet změněno, vlastnost je nastavena natrue
, IsCompiled i když schéma v objektu XmlSchemaSet bylo změněno. Reprocess Volání metody provádí všechny předběžné zpracování provedené Add metodou a nastaví IsCompiled vlastnost na 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);
Další informace o opětovném zpracování schématu v referenční XmlSchemaSetReprocess dokumentaci k metodě.
Kontrola schématu
Můžete použít Contains metodu XmlSchemaSet kontroly, zda schéma je obsaženo v objektu XmlSchemaSet. Metoda Contains přebírá cílový obor názvů nebo XmlSchema objekt, který chcete zkontrolovat. V obou případech metoda vrátí, Contains pokud schéma je obsaženo v ; XmlSchemaSetjinak vrátí false
.true
Další informace o kontrole schématu najdete v Contains referenční dokumentaci k metodě.
Odebrání schémat
Schémata jsou odebrána z XmlSchemaSet pomocí Remove a RemoveRecursive metody XmlSchemaSet. Metoda Remove odebere zadané schéma z XmlSchemaSet, zatímco RemoveRecursive metoda odebere zadané schéma a všechna schémata, která importuje z XmlSchemaSet.
Následující příklad znázorňuje přidání více schémat do objektu XmlSchemaSeta následné použití RemoveRecursive metody k odebrání jednoho ze schémat a všech schémat, která importuje.
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);
}
}
Další informace o odebírání schémat ze schémat XmlSchemaSetnaleznete v Remove referenční dokumentaci k metodám.RemoveRecursive
Rozlišení schématu a xs:import
Následující příklady popisují XmlSchemaSet chování při importu schémat, pokud existuje více schémat pro daný obor názvů v objektu XmlSchemaSet.
Představte si XmlSchemaSet například, že obsahuje více schémat pro http://www.contoso.com
obor názvů. Do souboru je přidáno schéma s následující xs:import
direktivou XmlSchemaSet.
<xs:import namespace="http://www.contoso.com" schemaLocation="http://www.contoso.com/schema.xsd" />
Pokusy XmlSchemaSet o import schématu http://www.contoso.com
pro obor názvů načtením z http://www.contoso.com/schema.xsd
adresy URL. V importovaném schématu jsou k dispozici pouze deklarace schématu a typy deklarované v dokumentu schématu, i když existují další dokumenty schématu http://www.contoso.com
pro obor názvů v XmlSchemaSetsouboru . schema.xsd
Pokud soubor nelze najít na http://www.contoso.com/schema.xsd
adrese URL, nenaimportuje se do schématu importu žádné schéma oboru http://www.contoso.com
názvů.
Ověřování dokumentů XML
Dokumenty XML lze ověřit na schématech v objektu XmlSchemaSet. Dokument XML ověříte přidáním schématu XmlSchemaSetSchemas do vlastnosti XmlReaderSettings objektu nebo přidáním XmlSchemaSet vlastnosti Schemas objektu XmlReaderSettings . Objekt XmlReaderSettings se pak používá Create metodou XmlReader třídy k vytvoření objektu XmlReader a ověření dokumentu XML.
Další informace o ověřování dokumentů XML pomocí , XmlSchemaSetnaleznete v tématu Xml Schema (XSD) Ověřování pomocí XmlSchemaSet.