Validierung eines XML-Schemas (XSD) mit „XmlSchemaSet“
XML-Dokumente können anhand eines XSD-Schemas (XML Schema Definition Language) in einem XmlSchemaSet validiert werden.
Validierung von XML-Dokumenten
XML-Dokumente werden von der Create-Methode der XmlReader-Klasse validiert. Wenn Sie ein XML-Dokument validieren möchten, müssen Sie ein XmlReaderSettings-Objekt erstellen, das ein XSD-Schema (XML Schema Definition) enthält, mit dem das XML-Dokument validiert wird.
Hinweis
Der System.Xml.Schema-Namespace enthält Erweiterungsmethoden, die bei Verwendung von LINQ to XML (C#) und LINQ to XML (Visual Basic) ein einfaches Validieren einer XML-Struktur anhand einer XSD-Datei ermöglichen. Weitere Informationen zum Validieren von XML-Dokumenten mit LINQ to XML finden Sie unter Vorgehensweise: Überprüfen mit XSD (LINQ to XML) (C#) und Vorgehensweise: Überprüfen mit XSD (LINQ to XML) (Visual Basic).
Um einem XmlSchemaSet ein einzelnes Schema oder mehrere Schemas (als XmlSchemaSet) hinzuzufügen, muss eines von beiden als Parameter an die Add-Methode des XmlSchemaSet übergeben werden. Beim Validieren von Dokumenten muss der Namespace des Dokuments dem Zielnamespace des Schemas im Schemasatz entsprechen.
Es folgt ein Beispiel für ein XML-Dokument.
<bookstore xmlns="http://www.contoso.com/books">
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
Im Folgenden wird das Schema dargestellt, das das XML-Dokument validiert.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="bookstore">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="author">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string" />
<xs:element minOccurs="0" name="first-name" type="xs:string" />
<xs:element minOccurs="0" name="last-name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="price" type="xs:decimal" />
</xs:sequence>
<xs:attribute name="genre" type="xs:string" use="required" />
<xs:attribute name="publicationdate" type="xs:date" use="required" />
<xs:attribute name="ISBN" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Im folgenden Codebeispiel wird das oben genannte Schema der Schemas-Eigenschaft des XmlReaderSettings-Objekts hinzugefügt. Das XmlReaderSettings-Objekt wird als Parameter an die Create-Methode des XmlReader-Objekts übergeben, das das oben genannte XML-Dokument validiert.
Die ValidationType-Eigenschaft des XmlReaderSettings-Objekts wird auf Schema
festgelegt, um die Validierung des XML-Dokuments durch die Create-Methode des XmlReader-Objekts zu erzwingen. Dem ValidationEventHandler-Objekt wird ein XmlReaderSettings hinzugefügt, der alle Warning- oder Error-Ereignisse behandelt, die von während der Validierung des XML-Dokuments und des Schemas gefundenen Fehlern ausgelöst werden.
#using <System.Xml.dll>
using namespace System;
using namespace System::Xml;
using namespace System::Xml::Schema;
static void booksSettingsValidationEventHandler( Object^ /*sender*/, ValidationEventArgs^ e )
{
if ( e->Severity == XmlSeverityType::Warning )
{
Console::Write( L"WARNING: " );
Console::WriteLine( e->Message );
}
else
if ( e->Severity == XmlSeverityType::Error )
{
Console::Write( L"ERROR: " );
Console::WriteLine( e->Message );
}
}
int main()
{
XmlReaderSettings^ booksSettings = gcnew XmlReaderSettings;
booksSettings->Schemas->Add( L"http://www.contoso.com/books", L"books.xsd" );
booksSettings->ValidationType = ValidationType::Schema;
booksSettings->ValidationEventHandler += gcnew ValidationEventHandler( booksSettingsValidationEventHandler );
XmlReader^ books = XmlReader::Create( L"books.xml", booksSettings );
while ( books->Read() )
{}
return 0;
}
using System;
using System.Xml;
using System.Xml.Schema;
class XmlSchemaSetExample
{
static void Main()
{
XmlReaderSettings booksSettings = new XmlReaderSettings();
booksSettings.Schemas.Add("http://www.contoso.com/books", "books.xsd");
booksSettings.ValidationType = ValidationType.Schema;
booksSettings.ValidationEventHandler += booksSettingsValidationEventHandler;
XmlReader books = XmlReader.Create("books.xml", booksSettings);
while (books.Read()) { }
}
static void booksSettingsValidationEventHandler(object sender, ValidationEventArgs e)
{
if (e.Severity == XmlSeverityType.Warning)
{
Console.Write("WARNING: ");
Console.WriteLine(e.Message);
}
else if (e.Severity == XmlSeverityType.Error)
{
Console.Write("ERROR: ");
Console.WriteLine(e.Message);
}
}
}
Imports System.Xml
Imports System.Xml.Schema
Class XmlSchemaSetExample
Shared Sub Main()
Dim booksSettings As XmlReaderSettings = New XmlReaderSettings()
booksSettings.Schemas.Add("http://www.contoso.com/books", "books.xsd")
booksSettings.ValidationType = ValidationType.Schema
AddHandler booksSettings.ValidationEventHandler, New ValidationEventHandler(AddressOf booksSettingsValidationEventHandler)
Dim books As XmlReader = XmlReader.Create("books.xml", booksSettings)
While books.Read()
End While
End Sub
Shared Sub booksSettingsValidationEventHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)
If e.Severity = XmlSeverityType.Warning Then
Console.Write("WARNING: ")
Console.WriteLine(e.Message)
ElseIf e.Severity = XmlSeverityType.Error Then
Console.Write("ERROR: ")
Console.WriteLine(e.Message)
End If
End Sub
End Class