Freigeben über


Schemaüberprüfung mit XPathNavigator

Mithilfe der XmlDocument Klasse können Sie den XML-Inhalt, der in einem XmlDocument Objekt enthalten ist, auf zwei Arten überprüfen. Die erste Möglichkeit besteht darin, den XML-Inhalt mithilfe eines validierenden XmlReader Objekts zu überprüfen, und die zweite Möglichkeit besteht darin, die Validate Methode der XmlDocument Klasse zu verwenden. Sie können auch eine schreibgeschützte Überprüfung von XML-Inhalten mithilfe der XPathDocument Klasse durchführen.

Überprüfen von XML-Daten

In der Standardeinstellung validiert die XmlDocument-Klasse ein XML-Dokument nicht mithilfe der DTD- oder XSD-Schemavalidierung (XML Schema Definition Language). Es wird nur überprüft, ob das XML-Dokument wohlgeformt ist.

Die erste Möglichkeit, ein XML-Dokument zu überprüfen, besteht darin, das Dokument so zu überprüfen, wie es mithilfe eines validierenden XmlDocument Objekts in ein XmlReader Objekt geladen wird. Die zweite Möglichkeit besteht darin, ein zuvor nicht typisiertes XML-Dokument mithilfe Validate der Methode der XmlDocument Klasse zu überprüfen. In beiden Fällen können Änderungen am überprüften XML-Dokument mithilfe Validate der Methode der XmlDocument Klasse erneut überprüft werden.

Validieren eines Dokuments beim Laden

Ein Validierungsobjekt XmlReader wird erstellt, indem ein XmlReaderSettings Objekt an die Create Methode der Klasse übergeben wird, die XmlReader ein XmlReaderSettings Objekt als Parameter verwendet. Das als Parameter übergebene XmlReaderSettings Objekt hat eine ValidationType Eigenschaft, die auf Schema gesetzt ist, und ein XML-Schema für das XML-Dokument, das im XmlDocument Objekt enthalten ist und zu seiner Schemas Eigenschaft hinzugefügt wurde. Das validierende XmlReader Objekt wird dann zum Erstellen des XmlDocument Objekts verwendet.

Im folgenden Beispiel wird die contosoBooks.xml Datei so überprüft, wie sie in das XmlDocument Objekt geladen wird, indem das XmlDocument Objekt mithilfe eines validierenden XmlReader Objekts erstellt wird. Da das XML-Dokument gemäß seinem Schema gültig ist, werden keine Schemaüberprüfungsfehler oder Warnungen generiert.

Imports System  
Imports System.Xml  
Imports System.Xml.Schema  
Imports System.Xml.XPath  
  
Class ValidatingReaderExample  
  
    Shared Sub Main(ByVal args() As String)  
  
        Try  
            Dim settings As XmlReaderSettings = New XmlReaderSettings()  
            settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")  
            settings.ValidationType = ValidationType.Schema  
  
            Dim reader As XmlReader = XmlReader.Create("contosoBooks.xml", settings)  
  
            Dim document As XmlDocument = New XmlDocument()  
            document.Load(reader)  
            Dim navigator As XPathNavigator = document.CreateNavigator()  
  
        Catch e As Exception  
            Console.WriteLine("ValidatingReaderExample.Exception: {0}", e.Message)  
        End Try  
  
    End Sub  
  
    Shared Sub SchemaValidationHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)  
  
        Select Case e.Severity  
            Case XmlSeverityType.Error  
                Console.WriteLine("Schema Validation Error: {0}", e.Message)  
                Exit Sub  
            Case XmlSeverityType.Warning  
                Console.WriteLine("Schema Validation Warning: {0}", e.Message)  
                Exit Sub  
        End Select  
  
    End Sub  
  
End Class  
using System;  
using System.Xml;  
using System.Xml.Schema;  
using System.Xml.XPath;  
  
class ValidatingReaderExample  
{  
    static void Main(string[] args)  
    {  
        try  
        {  
            XmlReaderSettings settings = new XmlReaderSettings();  
            settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");  
            settings.ValidationType = ValidationType.Schema;  
  
            XmlReader reader = XmlReader.Create("contosoBooks.xml", settings);  
  
            XmlDocument document = new XmlDocument();  
            document.Load(reader);  
            XPathNavigator navigator = document.CreateNavigator();  
        }  
        catch (Exception e)  
        {  
            Console.WriteLine("ValidatingReaderExample.Exception: {0}", e.Message);  
        }  
    }  
  
    static void SchemaValidationHandler(object sender, ValidationEventArgs e)  
    {  
        switch (e.Severity)  
        {  
            case XmlSeverityType.Error:  
                Console.WriteLine("Schema Validation Error: {0}", e.Message);  
                break;  
            case XmlSeverityType.Warning:  
                Console.WriteLine("Schema Validation Warning: {0}", e.Message);  
                break;  
        }  
    }  
}  

Im Beispiel wird die contosoBooks.xml Datei als Eingabe verwendet.

<?xml version="1.0" encoding="utf-8" ?>
<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 Beispiel wird auch contosoBooks.xsd als Eingabe verwendet.

<?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 obigen Beispiel wird ein XmlSchemaValidationException ausgelöst, wenn Load aufgerufen wird und ein Attribut- oder Elementtyp nicht mit dem im validierenden Schema angegebenen Typ übereinstimmt. Wenn ein ValidationEventHandler auf dem validierenden XmlReader festgelegt ist, wird ValidationEventHandler immer dann aufgerufen, wenn ein ungültiger Typ auftritt.

Greift der XmlSchemaException auf ein Attribut oder Element zu, bei dem für TypedValueinvalid angegeben ist, wird eine XPathNavigator ausgelöst .

Die Eigenschaft Validity kann dazu verwendet werden, um zu bestimmen, ob ein einzelnes Attribut oder Element gültig ist, wenn Attribute oder Elemente mit XPathNavigator abgerufen werden.

Hinweis

Wenn ein XML-Dokument in ein Objekt mit einem XmlDocument zugeordneten Schema geladen wird, das Standardwerte definiert, behandelt das XmlDocument Objekt diese Standardwerte so, als ob sie im XML-Dokument angezeigt werden. Dies bedeutet, dass die IsEmptyElement Eigenschaft immer für ein Element zurückgegeben false wird, das standardmäßig aus dem Schema stammt, auch wenn es im XML-Dokument als leeres Element geschrieben wurde.

Überprüfen eines Dokuments mithilfe der Validate-Methode

Die Validate Methode der XmlDocument Klasse überprüft das XML-Dokument, das in einem XmlDocument Objekt enthalten ist, anhand der schemas, die in der Eigenschaft des XmlDocumentSchemas Objekts angegeben sind, und führt eine Erweiterung des Infosets durch. Das Ergebnis ist, dass ein zuvor nicht typisiertes XML-Dokument im XmlDocument Objekt durch ein typisiertes Dokument ersetzt wird.

Das XmlDocument Objekt meldet Fehler bei der Schemaüberprüfung und Warnungen mithilfe des an die ValidationEventHandler Methode als Parameter übergebenen Validate Delegaten.

Im folgenden Beispiel wird die Datei im contosoBooks.xml Objekt gegen das Schema XmlDocument überprüft, das in der Eigenschaft contosoBooks.xsd des XmlDocument Objekts enthalten ist.

Imports System  
Imports System.Xml  
Imports System.Xml.Schema  
Imports System.Xml.XPath  
  
Class ValidateExample  
  
    Shared Sub Main(ByVal args() As String)  
  
        Dim document As XmlDocument = New XmlDocument()  
        document.Load("contosoBooks.xml")  
        Dim navigator As XPathNavigator = document.CreateNavigator()  
  
        document.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")  
        Dim validation As ValidationEventHandler = New ValidationEventHandler(AddressOf SchemaValidationHandler)  
  
        document.Validate(validation)  
  
    End Sub  
  
    Shared Sub SchemaValidationHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)  
  
        Select Case e.Severity  
            Case XmlSeverityType.Error  
                Console.WriteLine("Schema Validation Error: {0}", e.Message)  
                Exit Sub  
            Case XmlSeverityType.Warning  
                Console.WriteLine("Schema Validation Warning: {0}", e.Message)  
                Exit Sub  
        End Select  
  
    End Sub  
  
End Class  
using System;  
using System.Xml;  
using System.Xml.Schema;  
using System.Xml.XPath;  
  
class ValidateExample  
{  
    static void Main(string[] args)  
    {  
        XmlDocument document = new XmlDocument();  
        document.Load("contosoBooks.xml");  
        XPathNavigator navigator = document.CreateNavigator();  
  
        document.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");  
        ValidationEventHandler validation = new ValidationEventHandler(SchemaValidationHandler);  
  
        document.Validate(validation);  
    }  
  
    static void SchemaValidationHandler(object sender, ValidationEventArgs e)  
    {  
        switch (e.Severity)  
        {  
            case XmlSeverityType.Error:  
                Console.WriteLine("Schema Validation Error: {0}", e.Message);  
                break;  
            case XmlSeverityType.Warning:  
                Console.WriteLine("Schema Validation Warning: {0}", e.Message);  
                break;  
        }  
    }  
}  

Im Beispiel wird die contosoBooks.xml Datei als Eingabe verwendet.

<?xml version="1.0" encoding="utf-8" ?>
<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 Beispiel wird auch contosoBooks.xsd als Eingabe verwendet.

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

Überprüfen von Änderungen

Nachdem Änderungen an einem XML-Dokument vorgenommen wurden, können Sie die Änderungen mit der Methode der Validate der XmlDocument Klasse gegen das Schema für das XML-Dokument überprüfen.

Im folgenden Beispiel wird die contosoBooks.xml Datei so überprüft, wie sie in das XmlDocument Objekt geladen wird, indem das XmlDocument Objekt mithilfe eines validierenden XmlReader Objekts erstellt wird. Das XML-Dokument wird erfolgreich überprüft, da es geladen wird, ohne Schemaüberprüfungsfehler oder Warnungen zu generieren. Im Beispiel werden dann zwei Änderungen am XML-Dokument vorgenommen, die gemäß dem contosoBooks.xsd Schema ungültig sind. Die erste Änderung fügt ein ungültiges untergeordnetes Element ein, das zu einem Schemaüberprüfungsfehler führt, und die zweite Änderung legt den Wert eines typierten Knotens auf einen Wert fest, der gemäß dem Typ des Knotens ungültig ist, was zu einer Ausnahme führt.

Imports System  
Imports System.Xml  
Imports System.Xml.Schema  
Imports System.Xml.XPath  
  
Class ValidatingReaderExample  
  
    Shared Sub Main(ByVal args() As String)  
  
        Try  
            Dim settings As XmlReaderSettings = New XmlReaderSettings()  
            settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")  
            settings.ValidationType = ValidationType.Schema  
  
            Dim reader As XmlReader = XmlReader.Create("contosoBooks.xml", settings)  
  
            Dim document As XmlDocument = New XmlDocument()  
            document.Load(reader)  
            Dim navigator As XPathNavigator = document.CreateNavigator()  
  
            Dim validation As ValidationEventHandler = New ValidationEventHandler(AddressOf SchemaValidationHandler)  
  
            navigator.MoveToChild("bookstore", "http://www.contoso.com/books")  
            navigator.MoveToChild("book", "http://www.contoso.com/books")  
            navigator.MoveToChild("author", "http://www.contoso.com/books")  
  
            navigator.AppendChild("<title>Book Title</title>")  
  
            document.Validate(validation)  
  
            navigator.MoveToParent()  
            navigator.MoveToChild("price", "http://www.contoso.com/books")  
            navigator.SetTypedValue(DateTime.Now)  
        Catch e As Exception  
            Console.WriteLine("ValidatingReaderExample.Exception: {0}", e.Message)  
        End Try  
  
    End Sub  
  
    Shared Sub SchemaValidationHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)  
  
        Select Case e.Severity  
            Case XmlSeverityType.Error  
                Console.WriteLine("Schema Validation Error: {0}", e.Message)  
                Exit Sub  
            Case XmlSeverityType.Warning  
                Console.WriteLine("Schema Validation Warning: {0}", e.Message)  
                Exit Sub  
        End Select  
  
    End Sub  
  
End Class  
using System;  
using System.Xml;  
using System.Xml.Schema;  
using System.Xml.XPath;  
  
class ValidatingReaderExample  
{  
    static void Main(string[] args)  
    {  
        try  
        {  
            XmlReaderSettings settings = new XmlReaderSettings();  
            settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");  
            settings.ValidationType = ValidationType.Schema;  
  
            XmlReader reader = XmlReader.Create("contosoBooks.xml", settings);  
  
            XmlDocument document = new XmlDocument();  
            document.Load(reader);  
            XPathNavigator navigator = document.CreateNavigator();  
  
            ValidationEventHandler validation = new ValidationEventHandler(SchemaValidationHandler);  
  
            navigator.MoveToChild("bookstore", "http://www.contoso.com/books");  
            navigator.MoveToChild("book", "http://www.contoso.com/books");  
            navigator.MoveToChild("author", "http://www.contoso.com/books");  
  
            navigator.AppendChild("<title>Book Title</title>");  
  
            document.Validate(validation);  
  
            navigator.MoveToParent();  
            navigator.MoveToChild("price", "http://www.contoso.com/books");  
            navigator.SetTypedValue(DateTime.Now);  
        }  
        catch (Exception e)  
        {  
            Console.WriteLine("ValidatingReaderExample.Exception: {0}", e.Message);  
        }  
    }  
  
    static void SchemaValidationHandler(object sender, ValidationEventArgs e)  
    {  
        switch (e.Severity)  
        {  
            case XmlSeverityType.Error:  
                Console.WriteLine("Schema Validation Error: {0}", e.Message);  
                break;  
            case XmlSeverityType.Warning:  
                Console.WriteLine("Schema Validation Warning: {0}", e.Message);  
                break;  
        }  
    }  
}  

Im Beispiel wird die contosoBooks.xml Datei als Eingabe verwendet.

<?xml version="1.0" encoding="utf-8" ?>
<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 Beispiel wird auch contosoBooks.xsd als Eingabe verwendet.

<?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 obigen Beispiel werden zwei Änderungen an dem im XmlDocument-Objekt enthaltenen XML-Dokument vorgenommen. Als das XML-Dokument geladen wurde, wurden alle aufgetretenen Schemaüberprüfungsfehler von der Überprüfungsereignishandlermethode behandelt und in die Konsole geschrieben.

In diesem Beispiel wurden die Überprüfungsfehler nach dem Laden des XML-Dokuments eingeführt und mithilfe der Validate Methode der XmlDocument Klasse gefunden.

Änderungen, die mithilfe der SetTypedValue Methode der XPathNavigator Klasse vorgenommen wurden, führten zu einem InvalidCastException , weil der neue Wert gemäß dem Schematyp des Knotens ungültig war.

Weitere Informationen zum Ändern von Werten mithilfe der SetTypedValue Methode finden Sie im Thema Zum Ändern von XML-Daten mit XPathNavigator .

Schreibgeschützte Validierung

Die XPathDocument Klasse ist eine schreibgeschützte, speicherinterne Darstellung eines XML-Dokuments. Sowohl die XPathDocument Klasse als auch die XmlDocument Klasse erstellen XPathNavigator Objekte zum Navigieren und Bearbeiten von XML-Dokumenten. Da die XPathDocument-Klasse schreibgeschützt ist, können von XPathNavigator-Objekten zurückgegebene XPathDocument-Objekte das im XPathDocument-Objekt enthaltene XML-Dokument nicht bearbeiten.

Im Falle der Überprüfung können Sie ein XPathDocument Objekt wie ein XmlDocument Objekt mithilfe eines validierenden XmlReader Objekts erstellen, wie weiter oben in diesem Thema beschrieben. Das XPathDocument Objekt überprüft das XML-Dokument so, wie es geladen wird, aber da Sie die XML-Daten im XPathDocument Objekt nicht bearbeiten können, können Sie das XML-Dokument nicht erneut aktualisieren.

Weitere Informationen zu schreibgeschützten und bearbeitbaren XPathNavigator-Objekten finden Sie in dem Thema Lesen von XML-Daten mithilfe von XPathDocument und XmlDocument.

Siehe auch