Sémaérvényesítés az XPathNavigator használatával

Az XmlDocument osztály használatával kétféleképpen ellenőrizheti az objektumban XmlDocument található XML-tartalmat. Az első módszer az XML-tartalom érvényesítése egy érvényesítő XmlReader objektummal, a második módszer pedig az ValidateXmlDocument osztály metódusának használata. Az XPathDocument osztály használatával elvégezheti az XML-tartalom csak olvasható ellenőrzését is.

XML-adatok érvényesítése

Az XmlDocument osztály alapértelmezés szerint nem érvényesít egy XML-dokumentumot sem DTD, sem XML-sémadefiníciós nyelv (XSD) sémaérvényesítéssel. Csak azt ellenőrzi, hogy az XML-dokumentum megfelelően van-e formázva.

Az XML-dokumentumok érvényesítésének első módja a dokumentum ellenőrzése, mivel az egy érvényesítő XmlDocument objektummal töltődik be egy XmlReader objektumba. A második módszer egy korábban nem beírt XML-dokumentum ellenőrzése az ValidateXmlDocument osztály metódusával. Az ellenőrzött XML-dokumentum módosításai mindkét esetben újraértékelhetők az ValidateXmlDocument osztály metódusával.

Dokumentum érvényesítése betöltés közben

Az érvényesítő XmlReader objektum úgy jön létre, hogy átad egy XmlReaderSettings objektumot annak az osztálynak a CreateXmlReader metódusának, amely paraméterként használ egy XmlReaderSettings objektumot. A XmlReaderSettings objektum paraméterként adódik át, amelynek a ValidationType tulajdonsága Schema értékre van beállítva, és az XML-dokumentum számára az objektumban lévő XML-séma hozzá lett adva a XmlDocument objektum Schemas tulajdonságához. Ezután a rendszer az érvényesítő XmlReader objektumot használja az XmlDocument objektum létrehozásához.

Az alábbi példa érvényesíti a contosoBooks.xml fájlt, amikor az betöltésre kerül az XmlDocument objektumba, azáltal, hogy létrehozza a XmlDocument objektumot egy érvényesítő XmlReader objektum segítségével. Mivel az XML-dokumentum a sémája szerint érvényes, nem jön létre sémaérvényesítési hiba vagy figyelmeztetés.

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

A példa bemenetként használja a contosoBooks.xml fájlt.

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

A példa a contosoBooks.xsd is bemenetként használja.

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

A fenti példában a rendszer akkor küldi XmlSchemaValidationException el a parancsot, ha Load bármely attribútum vagy elemtípus nem egyezik meg a érvényesítési sémában megadott megfelelő típussal. Ha beállítanak egy ValidationEventHandler-t az érvényesítésre XmlReader, akkor a ValidationEventHandler meghívásra kerül, amikor érvénytelen típus fordul elő.

Amikor a XmlSchemaException egy TypedValue értékre beállított invalid attribútumot vagy elemet ér el, egy XPathNavigator kivétel keletkezik.

A Validity tulajdonság segítségével meghatározhatja, hogy egy adott attribútum vagy elem érvényes-e az attribútumokhoz vagy elemekhez való hozzáféréskor.XPathNavigator

Megjegyzés:

Ha egy XML-dokumentumot egy olyan társított sémával rendelkező objektumba XmlDocument tölt be, amely meghatározza az alapértelmezett értékeket, az objektum ezeket az XmlDocument alapértelmezett értékeket úgy kezeli, mintha azok megjelennének az XML-dokumentumban. Ez azt jelenti, hogy a IsEmptyElement tulajdonság mindig a sémából alapértelmezett elemhez ad vissza false , még akkor is, ha az XML-dokumentumban üres elemként írták.

Dokumentum érvényesítése az Érvényesítési módszerrel

Az Validate osztály metódusa ellenőrzi az XmlDocument objektumban XmlDocument található XML-dokumentumot az XmlDocument objektum Schemas tulajdonságában megadott sémákkal szemben, és adathalmaz-bővítést hajt végre. Az eredmény egy korábban nem beírt XML-dokumentum az XmlDocument objektumban, amelyet gépelt dokumentumra cserélt.

Az XmlDocument objektum sémaérvényesítési hibákat és figyelmeztetéseket jelent a ValidationEventHandler metódus paramétereként Validate átadott delegált használatával.

Az alábbi példa ellenőrzi az contosoBooks.xml objektumban XmlDocument található fájlt az contosoBooks.xsd objektum XmlDocument tulajdonságában található sémával Schemas szemben.

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

A példa bemenetként használja a contosoBooks.xml fájlt.

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

A példa a contosoBooks.xsd is bemenetként használja.

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

Módosítások érvényesítése

Miután módosította az XML-dokumentumot, az osztály metódusával ellenőrizheti a módosításokat az XML-dokumentum Validate sémája XmlDocument alapján.

Az alábbi példa érvényesíti a contosoBooks.xml fájlt, amikor az betöltésre kerül az XmlDocument objektumba, azáltal, hogy létrehozza a XmlDocument objektumot egy érvényesítő XmlReader objektum segítségével. Az XML-dokumentum sikeresen érvényesítve van, mivel a rendszer sémaérvényesítési hibák vagy figyelmeztetések létrehozása nélkül tölti be. A példa ezután két módosítást végez az XML-dokumentumon, amelyek a séma szerint contosoBooks.xsd érvénytelenek. Az első módosítás egy érvénytelen gyermekelemet szúr be, amely sémaérvényesítési hibát eredményez, a második módosítás pedig a beírt csomópont értékét a kivételt eredményező csomópont típusának megfelelően érvénytelen értékre állítja.

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

A példa bemenetként használja a contosoBooks.xml fájlt.

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

A példa a contosoBooks.xsd is bemenetként használja.

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

A fenti példában két módosítás történik az objektumban található XML-dokumentumon XmlDocument . Az XML-dokumentum betöltésekor az esetleges sémaérvényesítési hibákat az érvényesítési eseménykezelő metódus kezelte, és a konzolra írta.

Ebben a példában az érvényesítési hibákat az XML-dokumentum betöltése után vezették be, és a Validate osztály XmlDocument metódusával találták meg őket.

Az osztály metódusával SetTypedValue végrehajtott XPathNavigator módosítások azt eredményeztékInvalidCastException, hogy az új érték érvénytelen volt a csomópont sématípusa szerint.

Az értékek metódussal SetTypedValue történő módosításáról további információt az XML-adatok módosítása XPathNavigator használatával című témakörben talál.

Read-Only érvényesítés

Az XPathDocument osztály egy XML-dokumentum írásvédett, memórián belüli ábrázolása. Az XPathDocument osztály és az XmlDocument osztály is létrehoz XPathNavigator objektumokat az XML-dokumentumok navigálásához és szerkesztéséhez. Mivel a(z) XPathDocument osztály írásvédett osztály, a XPathNavigator objektumokból visszaadott XPathDocument objektumok nem tudják szerkeszteni a XPathDocument objektumban található XML-dokumentumot.

Érvényesítés esetén ugyanúgy hozhat létre XPathDocument objektumot, mint egy XmlDocument objektumot a jelen témakör korábbi részében ismertetett érvényesítő XmlReader objektummal. Az XPathDocument objektum betöltve ellenőrzi az XML-dokumentumot, de mivel nem szerkesztheti az xml-adatokat az XPathDocument objektumban, nem tudja újraértékelni az XML-dokumentumot.

Az írásvédett és szerkeszthető XPathNavigator objektumokról további információt az XML-adatok XPathDocument és XmlDocument használatával történő olvasásáról szóló témakörben talál.

Lásd még