Freigeben über


XML-Schemaüberprüfung (XSD) mit XmlSchemaCollection

Mit der XmlSchemaCollection können XML-Dokumente anhand von XSD-Schemata (XML Schema Definition Language) validiert werden. Die XmlSchemaCollection verbessert die Leistung, indem Schemata in der Sammlung gespeichert werden, sodass sie bei jeder Überprüfung nicht erneut in den Arbeitsspeicher geladen werden müssen. Wenn das Schema in der Schemaauflistung vorhanden ist, wird das schemaLocation Attribut verwendet, um das Schema in der Auflistung nachzuschlagen.

Von Bedeutung

Die XmlSchemaCollection Klasse ist jetzt veraltet und wurde durch die XmlSchemaSet Klasse ersetzt. Weitere Informationen zur XmlSchemaSet Klasse finden Sie unter XmlSchemaSet für die Schemakompilierung.

Das folgende Beispiel zeigt das Stammelement einer Datendatei.

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

In diesem Beispiel ist der Wert des targetNamespace Attributs urn:bookstore-schema, was derselbe Namespace ist, der verwendet wird, wenn das Schema zu XmlSchemaCollection hinzugefügt wird.

Im folgenden Codebeispiel wird ein XML-Schema zu dem XmlSchemaCollection hinzugefügt.

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);  

Das targetNamespace-Attribut wird normalerweise verwendet, wenn Sie die namespaceURI-Eigenschaft in der Add-Methode für das XmlSchemaCollection hinzufügen. Sie können eine null-Referenz angeben, bevor Sie das Schema dem XmlSchemaCollection hinzufügen. Eine leere Zeichenfolge ("") sollte für Schemas ohne Namespace verwendet werden. Das XmlSchemaCollection Schema kann nur ein Schema ohne Namespace aufweisen.

Im folgenden Codebeispiel wird dem Element XmlSchemaCollection ein XML-Schema, HeadCount.xsd, hinzugefügt und HeadCount.xmlwird validiert.

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);  
      }  
   }  
}  

Im Folgenden wird der Inhalt der zu überprüfenden Eingabedatei HeadCount.xmlbeschrieben.

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

Im Folgenden wird der Inhalt der XML-Schemadatei "HeadCount.xsd" beschrieben, anhand derer überprüft werden soll.

<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>  

Im folgenden Codebeispiel wird ein XmlValidatingReader erstellt, das ein XmlTextReader nimmt. Die Eingabedatei sample4.xmlwird anhand des XML-Schemas "sample4.xsd" überprüft.

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);  
    }  

Im Folgenden wird der Inhalt der zu überprüfenden Eingabedatei sample4.xmlbeschrieben.

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

Im Folgenden wird der Inhalt der XML-Schemadatei (sample4.xsd) beschrieben, anhand derer überprüft werden soll.

<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>  

Siehe auch