Udostępnij za pośrednictwem


Weryfikacja schematu XML (XSD) przy użyciu klasy XmlSchemaCollection

Możesz użyć elementu XmlSchemaCollection , aby zweryfikować dokument XML względem schematów języka definicji schematu XML (XSD). XmlSchemaCollection poprawia wydajność dzięki przechowywaniu schematów w kolekcji, więc nie są ładowane do pamięci za każdym razem, gdy następuje walidacja. Jeśli schemat istnieje w kolekcji schematów, schemaLocation atrybut jest używany do wyszukiwania schematu w kolekcji.

Ważne

Klasa XmlSchemaCollection jest teraz przestarzała i została zastąpiona klasą XmlSchemaSet . Aby uzyskać więcej informacji na temat XmlSchemaSet klasy, zobacz XmlSchemaSet for Schema Compilation (Kompilacja schematu).

W poniższym przykładzie przedstawiono element główny pliku danych.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"  
    xmlns="urn:bookstore-schema"  
    elementFormDefault="qualified"  
    targetNamespace="urn:bookstore-schema">  

W tym przykładzie wartość atrybutu targetNamespace to urn:bookstore-schema, czyli ta sama przestrzeń nazw, która jest używana podczas dodawania schematu do elementu XmlSchemaCollection.

Poniższy przykładowy kod dodaje schemat XML do elementu XmlSchemaCollection.

Dim xsc As New XmlSchemaCollection()  
' XML Schema.  
xsc.Add("urn:bookstore-schema", schema)
reader = New XmlTextReader(filename)  
vreader = New XmlValidatingReader(reader)  
vreader.Schemas.Add(xsc)  
XmlSchemaCollection xsc = new XmlSchemaCollection();  
// XML Schema.  
xsc.Add("urn:bookstore-schema", schema);  
reader = new XmlTextReader (filename);  
vreader = new XmlValidatingReader (reader);  
vreader.Schemas.Add(xsc);  

Atrybut targetNamespace jest zwykle używany, gdy dodajesz właściwość namespaceURI w metodzie Add dla XmlSchemaCollection. Można określić odwołanie o wartości null przed dodaniem schematu do XmlSchemaCollection. Pusty ciąg ("") powinien być używany dla schematów bez przestrzeni nazw. Element XmlSchemaCollection może mieć tylko jeden schemat bez przestrzeni nazwowej.

Poniższy przykładowy kod dodaje schemat XML HeadCount.xsd do elementu XmlSchemaCollection i waliduje HeadCount.xml.

Imports System  
Imports System.IO  
Imports System.Xml  
Imports System.Xml.Schema  
  
Namespace ValidationSample  
  
   Class Sample  
  
      Public Shared Sub Main()  
         Dim tr As New XmlTextReader("HeadCount.xml")  
         Dim vr As New XmlValidatingReader(tr)  
  
         vr.Schemas.Add("xsdHeadCount", "HeadCount.xsd")  
         vr.ValidationType = ValidationType.Schema  
         AddHandler vr.ValidationEventHandler, AddressOf ValidationHandler  
  
         While vr.Read()  
         End While  
         Console.WriteLine("Validation finished")  
      End Sub  
      ' Main  
  
      Public Shared Sub ValidationHandler(sender As Object, args As ValidationEventArgs)  
         Console.WriteLine("***Validation error")  
         Console.WriteLine("Severity:{0}", args.Severity)  
         Console.WriteLine("Message:{0}", args.Message)  
      End Sub  
      ' ValidationHandler  
   End Class  
   ' Sample  
End Namespace  
' ValidationSample  
using System;  
using System.IO;  
using System.Xml;  
using System.Xml.Schema;  
  
namespace ValidationSample  
{  
   class Sample  
   {  
      public static void Main()  
      {  
         XmlTextReader tr = new XmlTextReader("HeadCount.xml");  
         XmlValidatingReader vr = new XmlValidatingReader(tr);  
  
         vr.Schemas.Add("xsdHeadCount", "HeadCount.xsd");  
         vr.ValidationType = ValidationType.Schema;  
         vr.ValidationEventHandler += new ValidationEventHandler (ValidationHandler);  
  
         while(vr.Read());  
         Console.WriteLine("Validation finished");  
      }  
  
      public static void ValidationHandler(object sender, ValidationEventArgs args)  
      {  
         Console.WriteLine("***Validation error");  
         Console.WriteLine("\tSeverity:{0}", args.Severity);  
         Console.WriteLine("\tMessage  :{0}", args.Message);  
      }  
   }  
}  

Poniżej przedstawiono zawartość pliku wejściowego, HeadCount.xml, który ma zostać zweryfikowany.

<!--Load HeadCount.xsd in SchemaCollection for Validation-->  
<hc:HeadCount xmlns:hc='xsdHeadCount'>  
   <Name>Waldo Pepper</Name>  
   <Name>Red Pepper</Name>  
</hc:HeadCount>  

Poniżej przedstawiono zawartość pliku schematu XML HeadCount.xsd do zweryfikowania.

<xs:schema xmlns="xsdHeadCount" targetNamespace="xsdHeadCount" xmlns:xs="http://www.w3.org/2001/XMLSchema">  
   <xs:element name='HeadCount' type="HEADCOUNT"/>  
   <xs:complexType name="HEADCOUNT">  
      <xs:sequence>  
         <xs:element name='Name' type='xs:string' maxOccurs='unbounded'/>  
      </xs:sequence>  
      <xs:attribute name='division' type='xs:int' use='optional' default='8'/>  
   </xs:complexType>  
</xs:schema>  

Poniższy przykład kodu tworzy obiekt XmlValidatingReader , który przyjmuje element XmlTextReader. Plik wejściowy, sample4.xml, jest weryfikowany względem schematu XML, sample4.xsd.

Dim tr As New XmlTextReader("sample4.xml")  
Dim vr As New XmlValidatingReader(tr)  
vr.ValidationType = ValidationType.Schema  
vr.Schemas.Add("datatypesTest", "sample4.xsd")  
AddHandler vr.ValidationEventHandler, AddressOf ValidationCallBack  
While vr.Read()  
   Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name)  
End While  
XmlTextReader tr = new XmlTextReader("sample4.xml");  
XmlValidatingReader vr = new XmlValidatingReader(tr);  
vr.ValidationType = ValidationType.Schema;  
        vr.Schemas.Add("datatypesTest", "sample4.xsd");  
vr.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);  
while(vr.Read()) {  
    Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name);  
    }  

Poniżej przedstawiono zawartość pliku wejściowego, sample4.xml, który ma zostać zweryfikowany.

<datatypes xmlns="datatypesTest">  
    <number>  
        <number_1>123</number_1>  
    </number>  
</datatypes>  

Poniżej przedstawiono zawartość pliku schematu XML sample4.xsd do zweryfikowania.

<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:tns="datatypesTest"
    targetNamespace="datatypesTest"  
    elementFormDefault="qualified">  
  
<xs:element name = "datatypes">  
  <xs:complexType>  
    <xs:all>  
        <xs:element name="number">  
            <xs:complexType>  
                <xs:sequence>  
                    <xs:element name="number_1" type="xs:decimal" maxOccurs="unbounded"/>  
                </xs:sequence>  
            </xs:complexType>  
        </xs:element>  
    </xs:all>  
  </xs:complexType>  
</xs:element>  
</xs:schema>  

Zobacz także