Klasa XmlSchemaSet na potrzeby kompilacji schematu
XmlSchemaSetOpisuje pamięć podręczną, w której można przechowywać i weryfikować schematy języka definicji schematu XML (XSD).
Klasa XmlSchemaSet
To XmlSchemaSet pamięć podręczna, w której można przechowywać i weryfikować schematy języka definicji schematu XML (XSD).
W System.Xml wersji 1.0 schematy XML zostały załadowane do XmlSchemaCollection klasy jako biblioteka schematów. W System.Xml wersji 2.0 XmlValidatingReader klasy i XmlSchemaCollection są przestarzałe i zostały zastąpione Create odpowiednio metodami i klasą XmlSchemaSet .
Wprowadzono rozwiązanie XmlSchemaSet wielu problemów, takich jak zgodność standardów, wydajność i przestarzały format schematu Microsoft XML-Data Reduced (XDR).
Poniżej przedstawiono porównanie XmlSchemaCollection klasy i XmlSchemaSet klasy.
Xmlschemacollection | Xmlschemaset |
---|---|
Obsługuje schematy XML XDR i W3C firmy Microsoft. | Obsługuje tylko schematy XML W3C. |
Schematy są kompilowane po wywołaniu Add metody. | Schematy nie są kompilowane, gdy metoda jest wywoływana Add . Zapewnia to poprawę wydajności podczas tworzenia biblioteki schematów. |
Każdy schemat generuje pojedynczą skompilowaną wersję, która może spowodować "wyspy schematu". W związku z tym wszystkie operacje dołączania i importowania są ograniczone tylko w ramach tego schematu. | Skompilowane schematy generują pojedynczy schemat logiczny — "zestaw" schematów. Wszystkie zaimportowane schematy w schemacie, które są dodawane do zestawu, są bezpośrednio dodawane do samego zestawu. Oznacza to, że wszystkie typy są dostępne dla wszystkich schematów. |
W kolekcji może istnieć tylko jeden schemat dla określonej docelowej przestrzeni nazw. | Można dodać wiele schematów dla tej samej docelowej przestrzeni nazw, o ile nie ma konfliktów typów. |
Migrowanie do zestawu XmlSchemaSet
Poniższy przykład kodu zawiera przewodnik migracji do nowej XmlSchemaSet klasy z przestarzałej XmlSchemaCollection klasy. W przykładzie kodu przedstawiono następujące główne różnice między dwiema klasami.
Add W przeciwieństwie do metody XmlSchemaCollection klasy schematy nie są kompilowane podczas wywoływania Add metody XmlSchemaSet. Metoda CompileXmlSchemaSet metody jest jawnie wywoływana w przykładowym kodzie.
Aby wykonać iterację w obiekcie XmlSchemaSet, należy użyć Schemas właściwości XmlSchemaSet.
Poniżej przedstawiono przestarzały XmlSchemaCollection przykład kodu.
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);
}
Poniżej przedstawiono równoważny XmlSchemaSet przykład kodu.
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);
}
Dodawanie i pobieranie schematów
Schematy są dodawane do XmlSchemaSet metody przy użyciu Add metody XmlSchemaSet. Po dodaniu schematu do XmlSchemaSetobiektu jest skojarzony z docelowym identyfikatorem URI przestrzeni nazw. Docelowy identyfikator URI przestrzeni nazw można określić jako parametr Add metody lub jeśli nie określono docelowej przestrzeni nazw, XmlSchemaSet używa docelowej przestrzeni nazw zdefiniowanej w schemacie.
Schematy są pobierane z XmlSchemaSet obiektu przy użyciu Schemas właściwości XmlSchemaSet. Właściwość Schemas obiektu XmlSchemaSet umożliwia iterowanie XmlSchema obiektów zawartych w obiekcie XmlSchemaSet. Właściwość Schemas zwraca wszystkie XmlSchema obiekty zawarte w XmlSchemaSetobiekcie lub, biorąc pod uwagę docelowy parametr przestrzeni nazw, zwraca wszystkie XmlSchema obiekty należące do docelowej przestrzeni nazw. Jeśli null
zostanie określony jako docelowy parametr przestrzeni nazw, Schemas właściwość zwraca wszystkie schematy bez przestrzeni nazw.
Poniższy przykład dodaje books.xsd
schemat w http://www.contoso.com/books
przestrzeni nazw do XmlSchemaSetelementu , pobiera wszystkie schematy należące do http://www.contoso.com/books
przestrzeni nazw z XmlSchemaSetprogramu , a następnie zapisuje te schematy w Consoleobiekcie .
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);
}
Aby uzyskać więcej informacji na temat dodawania i pobierania schematów z XmlSchemaSet obiektu, zobacz Add metodę i dokumentację referencyjną Schemas właściwości.
Kompilowanie schematów
Schematy w obiekcie XmlSchemaSet są kompilowane w jednym schemacie logicznym za pomocą Compile metody XmlSchemaSet.
Uwaga
W przeciwieństwie do przestarzałej XmlSchemaCollection klasy schematy nie są kompilowane podczas wywoływania Add metody.
Compile Jeśli metoda zostanie wykonana pomyślnie, IsCompiled właściwość właściwości XmlSchemaSet jest ustawiona na true
wartość .
Uwaga
Nie IsCompiled ma to wpływu na właściwość , jeśli schematy są edytowane w XmlSchemaSetpliku . Aktualizacje poszczególnych schematów w obiekcie XmlSchemaSet nie są śledzone. W związku z tym właściwość może być true
nawet wtedy, IsCompiled gdy jeden ze schematów zawartych w XmlSchemaSet obiekcie został zmieniony, o ile nie dodano ani nie usunięto schematów z klasy XmlSchemaSet.
Poniższy przykład dodaje books.xsd
plik do XmlSchemaSet pliku , a następnie wywołuje metodę 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();
Aby uzyskać więcej informacji na temat kompilowania schematów w obiekcie , zobacz dokumentację referencyjną XmlSchemaSetCompile metody.
Ponowne przetwarzanie schematów
Ponowne przetwarzanie schematu w obiekcie XmlSchemaSet wykonuje wszystkie kroki przetwarzania wstępnego wykonywane na schemacie, gdy Add wywoływana jest metoda XmlSchemaSet . Jeśli wywołanie Reprocess metody zakończy się pomyślnie, IsCompiled właściwość XmlSchemaSet właściwości jest ustawiona na false
.
Metoda Reprocess powinna być używana, gdy schemat w XmlSchemaSet obiekcie został zmodyfikowany po wykonaniu XmlSchemaSet kompilacji.
Poniższy przykład ilustruje ponowne przetwarzanie schematu dodanego XmlSchemaSet do metody przy użyciu Reprocess metody . XmlSchemaSet Po skompilowaniu przy użyciu Compile metody , a schemat dodany do XmlSchemaSet obiektu jest modyfikowany, IsCompiled właściwość jest ustawiona na true
wartość , mimo że schemat w XmlSchemaSet obiekcie został zmodyfikowany. Reprocess Wywołanie metody wykonuje wszystkie wstępne przetwarzanie wykonywane przez metodę Add i ustawia IsCompiled właściwość 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);
Aby uzyskać więcej informacji na temat ponownego przetwarzania schematu w elemencie XmlSchemaSet, zobacz dokumentację referencyjną Reprocess metody.
Sprawdzanie schematu
Możesz użyć Contains metody , XmlSchemaSet aby sprawdzić, czy schemat jest zawarty w obiekcie XmlSchemaSet. Metoda Contains przyjmuje docelową przestrzeń nazw lub XmlSchema obiekt do sprawdzenia. W obu przypadkach metoda zwraca wartość Contains , jeśli schemat jest zawarty w obiekcie XmlSchemaSet; w przeciwnym razie zwraca wartość false
.true
Aby uzyskać więcej informacji na temat sprawdzania schematu, zobacz dokumentację referencyjną Contains metody.
Usuwanie schematów
Schematy są usuwane z XmlSchemaSet metody Remove i RemoveRecursive .XmlSchemaSet Metoda Remove usuwa określony schemat z XmlSchemaSetklasy , podczas gdy RemoveRecursive metoda usuwa określony schemat i wszystkie schematy, które importuje z XmlSchemaSetklasy .
W poniższym przykładzie pokazano dodawanie wielu schematów do XmlSchemaSetelementu , a następnie użycie RemoveRecursive metody w celu usunięcia jednego ze schematów i wszystkich importowanych schematów.
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);
}
}
Aby uzyskać więcej informacji na temat usuwania schematów z obiektu , zobacz dokumentację referencyjną XmlSchemaSetmetod i RemoveRecursive .Remove
Rozpoznawanie schematu i xs:import
W poniższych przykładach opisano XmlSchemaSet zachowanie importowania schematów, gdy w XmlSchemaSetobiekcie istnieje wiele schematów dla danej przestrzeni nazw.
Rozważmy na przykład element XmlSchemaSet zawierający wiele schematów dla http://www.contoso.com
przestrzeni nazw. Schemat z następującą xs:import
dyrektywą jest dodawany do elementu XmlSchemaSet.
<xs:import namespace="http://www.contoso.com" schemaLocation="http://www.contoso.com/schema.xsd" />
Próba XmlSchemaSet zaimportowania schematu http://www.contoso.com
dla przestrzeni nazw przez załadowanie go z http://www.contoso.com/schema.xsd
adresu URL. Tylko deklaracja schematu i typy zadeklarowane w dokumencie schematu są dostępne w schemacie importowania, mimo że istnieją inne dokumenty schematu dla http://www.contoso.com
przestrzeni nazw w XmlSchemaSetpliku . schema.xsd
Jeśli nie można znaleźć pliku pod http://www.contoso.com/schema.xsd
adresem URL, żaden schemat http://www.contoso.com
przestrzeni nazw nie zostanie zaimportowany do schematu importowania.
Weryfikowanie dokumentów XML
Dokumenty XML można zweryfikować względem schematów w elemecie XmlSchemaSet. Dokument XML można zweryfikować, dodając schemat do XmlSchemaSetSchemas właściwości XmlReaderSettings obiektu lub dodając element XmlSchemaSet do Schemas właściwości XmlReaderSettings obiektu. Następnie XmlReaderSettings obiekt jest używany przez Create metodę XmlReader klasy do utworzenia XmlReader obiektu i zweryfikowania dokumentu XML.
Aby uzyskać więcej informacji na temat sprawdzania poprawności dokumentów XML przy użyciu elementu XmlSchemaSet, zobacz Sprawdzanie poprawności schematu XML (XSD) przy użyciu elementu XmlSchemaSet.