Validierung anhand eines XML-Schemas (XSD) mit "XmlValidatingReader"
Die XSD-Schemavalidierung (XML Schema Definition Language) wird unter Verwendung der Validitätseinschränkunggen implementiert, die in der XML-Schemaempfehlung des W3C (World Wide Web Consortium) definiert sind. Microsoft .NET Framework unterstützt die Empfehlung "XML Schema 2001 Recommendation" des W3C. Alle XML-Schemata müssen den Namespace http://www.w3c.org/2001/XMLSchema enthalten.
Jedes XML-Schema wird einem Namespace-URI (Uniform Resource Identifier) zugeordnet. Der XmlValidatingReader kann das schemaLocation-Attribut des XML-Schemas (XSD) in der Datei verwenden, die an den Namespace der XML-Schemainstanz, http://www.w3.org/2001/XMLSchema-instance, gebunden ist. Wenn das Schema in einer XmlSchemaCollection gespeichert wird, verwendet der XmlValidatingReader den Namespace-URI, der beim Hinzufügen des Schemas zur Auflistung angegeben wurde. Üblicherweise ist dies der Zielnamespace des Schemas.
Der XmlValidatingReader verwendet zum Identifizieren des XML-Schemas das schemaLocation-Attribut. Das folgende Beispiel zeigt das Stammelement der Datendatei.
<bookstore xmlns="urn:bookstore-schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:bookstore-schema books.xsd">
Hinweis |
---|
Die XmlValidatingReader-Klasse ist in .NET Framework, Version 2.0 veraltet.Mit der XmlReaderSettings-Klasse und der Create-Methode können Sie eine XmlReader-Instanz zur Validierung erstellen.Weitere Informationen finden Sie unter Validieren von XML-Daten mit "XmlReader". |
Beispiel
Im folgenden Codebeispiel wird ein XmlValidatingReader erstellt, der einen XmlTextReader erfordert. Die Eingabedatei HeadCount.xml wird anhand der Datei HeadCount.xsd des XML-Schemas 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.ValidationType = ValidationType.Schema
AddHandler vr.ValidationEventHandler, AddressOf ValidationHandler
While vr.Read()
PrintTypeInfo(vr)
If vr.NodeType = XmlNodeType.Element Then
While vr.MoveToNextAttribute()
PrintTypeInfo(vr)
End While
End If
End While
Console.WriteLine("Validation finished")
End Sub
' Main
Public Shared Sub PrintTypeInfo(vr As XmlValidatingReader)
If Not (vr.SchemaType Is Nothing) Then
If TypeOf vr.SchemaType Is XmlSchemaDatatype Or TypeOf vr.SchemaType Is XmlSchemaSimpleType Then
Dim value As Object = vr.ReadTypedValue()
Console.WriteLine("{0}({1},{2}):{3}", vr.NodeType, vr.Name, value.GetType().Name, value)
Else
If TypeOf vr.SchemaType Is XmlSchemaComplexType Then
Dim sct As XmlSchemaComplexType = CType(vr.SchemaType, XmlSchemaComplexType)
Console.WriteLine("{0}({1},{2})", vr.NodeType, vr.Name, sct.Name)
End If
End If
End If
End Sub
' PrintTypeInfo
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.ValidationType = ValidationType.Schema;
vr.ValidationEventHandler += new ValidationEventHandler (ValidationHandler);
while(vr.Read())
{
PrintTypeInfo(vr);
if(vr.NodeType == XmlNodeType.Element)
{
while(vr.MoveToNextAttribute())
PrintTypeInfo(vr);
}
}
Console.WriteLine("Validation finished");
}
public static void PrintTypeInfo(XmlValidatingReader vr)
{
if(vr.SchemaType != null)
{
if(vr.SchemaType is XmlSchemaDatatype || vr.SchemaType is XmlSchemaSimpleType)
{
object value = vr.ReadTypedValue();
Console.WriteLine("{0}({1},{2}):{3}", vr.NodeType, vr.Name, value.GetType().Name, value);
}
else if(vr.SchemaType is XmlSchemaComplexType)
{
XmlSchemaComplexType sct = (XmlSchemaComplexType)vr.SchemaType;
Console.WriteLine("{0}({1},{2})", vr.NodeType, vr.Name, sct.Name);
}
}
}
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 validierenden Eingabedatei HeadCount.xml dargestellt.
<hc:HeadCount xmlns:hc='xsdHeadCount' xsi:schemaLocation='xsdHeadCount HeadCount.xsd' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
<Name>Waldo Pepper</Name>
<Name>Red Pepper</Name>
</hc:HeadCount>
Im folgenden Beispiel wird der Inhalt der XML-Schemadatei HeadCount.xsd dargestellt, die zur Validierung 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>
Siehe auch
Konzepte
Lesen von XML mit dem "XmlReader"