Freigeben über


Gültigkeitsprüfung von XML-Schema (XSD) mit XmlSchemaCollection

Mit XmlValidatingCollection kann ein XML-Dokument anhand von XSD (XML Schema definition language)-Schemas überprüft werden. Durch XmlSchemaCollection wird die Leistung gesteigert, indem die Schemas in der Auflistung gespeichert werden, so dass sie bei Durchführung einer Überprüfung nicht jedes Mal in den Arbeitsspeicher geladen werden müssen. Wenn das Schema in der Auflistung vorhanden ist, wird dort mit Hilfe des schemaLocation-Attributs danach gesucht.

Im folgenden Beispiel wird das Stammelement einer Datendatei gezeigt.

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

Der Wert des targetNamespace-Attributs in diesem Beispiel ist urn:bookstore-schema. Dabei handelt es sich um denselben Namespace, der beim Hinzufügen des Schemas zu XmlSchemaCollection verwendet wird.

Im folgenden Codebeispiel wird ein XML-Schema zu 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)
[C#]
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 im Allgemeinen beim Hinzufügen der namespaceURI-Eigenschaft zur Add-Methode von XmlSchemaCollection verwendet. Ein NULL-Verweis kann angegeben werden, bevor das Schema zu XmlSchemaCollection hinzugefügt wird. Bei Schemas ohne Namespace sollte eine leere Zeichenfolge ("") verwendet werden. XmlSchemaCollection kann nur über ein Schema ohne Namespace verfügen.

Im folgenden Codebeispiel wird das XML-Schema HeadCount.xsd zu XmlSchemaCollection hinzugefügt und eine Überprüfung von HeadCount.xml durchgeführt.

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
[C#]
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 Beispiel wird der Inhalt der zu überprüfenden Eingabedatei HeadCount.xml dargestellt.

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

Im folgenden Beispiel wird der Inhalt der XML-Schemadatei HeadCount.xsd dargestellt, die zur Überprüfung herangezogen wird.

<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, der XmlTextReader übernimmt. Die Eingabedatei sample4.xml wird 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
[C#]
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 Beispiel wird der Inhalt der zu überprüfenden Eingabedatei sample4.xml dargestellt.

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

Im folgenden Beispiel wird der Inhalt der XML-Schemadatei sample4.xsd dargestellt, die zur Überprüfung herangezogen wird.

<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

XmlSchemaCollection als Schemacache | Gültigkeitsprüfung von XML mit Schemas | XmlParserContext-Klasse | XmlValidatingReader.ValidationEventHandler-Ereignis | XmlValidatingReader.Schemas-Eigenschaft