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 jsou třídy XmlValidatingReader a XmlSchemaCollection zastaralé a byly nahrazeny metodami Create a třídou XmlSchemaSet.

XmlSchemaSet byl zaveden k vyřešení řady problémů, včetně kompatibility standardů, výkonu a zastaralého formátu schématu Microsoft XML-Data Reduced (XDR).

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.

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 XmlSchemaSet je toto schéma 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 pomocí vlastnosti Schemas() objektu XmlSchemaSet. Vlastnost Schemas()XmlSchemaSet umožňuje iterovat skrze objekty XmlSchema obsažené v 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 viz dokumentaci k metodě Add a referenční dokumentaci k vlastnosti Schemas().

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é třídy XmlSchemaCollection nejsou schémata zkompilována při zavolání metody Add.

Pokud se Compile metoda úspěšně provede, vlastnost IsCompiled objektu XmlSchemaSet je nastavena na hodnotu true.

Poznámka:

Vlastnost IsCompiled není ovlivněna, pokud jsou schémata upravena v režimu XmlSchemaSet. Aktualizace jednotlivých schémat v XmlSchemaSet nejsou sledovány. V důsledku toho může být IsCompiled vlastnost true, i když některé ze schémat obsažených v XmlSchemaSet bylo změněno, pokud do XmlSchemaSet nebyla přidána ani odstraněna žádná schémata.

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 XmlSchemaSet naleznete v referenční dokumentaci k metodě Compile.

Opětovné zpracování schémat

Opětovné zpracování schématu XmlSchemaSet provede všechny kroky předběžného zpracování, které jsou provedeny při zavolání metody Add z XmlSchemaSet. Pokud je volání metody Reprocess úspěšné, vlastnost IsCompiled objektu XmlSchemaSet je nastavena na false.

Metoda Reprocess by se měla použít, když bylo schéma ve XmlSchemaSet změněno po tom, co XmlSchemaSet provedlo kompilaci.

Následující příklad ukazuje opětovné zpracování schématu přidaného do XmlSchemaSet pomocí metody Reprocess. Po kompilaci XmlSchemaSet pomocí metody Compile a schéma přidané do XmlSchemaSet je změněno, IsCompiled vlastnost je nastavena na true, i když schéma v XmlSchemaSet bylo změněno. Volání metody Reprocess provádí veškeré předběžné zpracování prováděné metodou Add a nastaví vlastnost IsCompiled 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 naleznete v dokumentaci k metodě, konkrétně v referenční části XmlSchemaSetReprocess.

Kontrola schématu

Můžete použít metodu Contains z XmlSchemaSet k ověření, zda je schéma obsaženo v XmlSchemaSet. Metoda Contains přebírá buď cílový obor názvů, nebo XmlSchema objekt k ověření. V obou případech metoda vrátí Contains, pokud je schéma obsaženo ve true; jinak vrátí XmlSchemaSet.

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í metod Remove a RemoveRecursive z 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 z XmlSchemaSet naleznete v referenční dokumentaci k metodám RemoveRemoveRecursive.

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.

Například si představte XmlSchemaSet, který obsahuje více schémat pro http://www.contoso.com jmenný prostor. Do xs:import je přidáno schéma s následující direktivou XmlSchemaSet.

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

Pokus XmlSchemaSet importovat schéma pro obor názvů http://www.contoso.com jeho načtením z adresy URL http://www.contoso.com/schema.xsd. 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 pro obor názvů http://www.contoso.com ve XmlSchemaSet. Pokud nelze soubor schema.xsd najít na adrese URL http://www.contoso.com/schema.xsd, nenaimportuje se žádné schéma oboru názvů http://www.contoso.com do importujícího schématu.

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í XmlSchemaSet, naleznete v tématu Validace pomocí sady schémat XML (XSD) s XmlSchemaSet.

Viz také