Megosztás a következőn keresztül:


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 osztály használatával XPathDocument az XML-tartalom írásvédett ellenőrzését is elvégezheti.

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ő XmlReader objektummal töltődik be egy XmlDocument 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 ellenőrzése betöltve

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 paraméterként ValidationType átadott objektumhoz egy tulajdonság van beállítva Schema , valamint egy XML-séma az objektumban lévő XML-dokumentumhoz, amely hozzá lett adva a XmlDocument tulajdonságához Schemas . Ezután a rendszer az érvényesítő XmlReader objektumot használja az XmlDocument objektum létrehozásához.

Az alábbi példa ellenőrzi, hogy a contosoBooks.xml fájl be van-e töltve az XmlDocument objektumba XmlDocument egy érvényesítő XmlReader objektum használatával. 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 bemenetként contosoBooks.xsd is szerepel.

<?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 a rendszer beállítja ValidationEventHandler az ellenőrzést XmlReader, a rendszer meghívja a ValidationEventHandler rendszer, amikor érvénytelen típust tapasztal.

A XmlSchemaException rendszer egy olyan attribútumot vagy elemet ad vissza, amelynek TypedValue beállított invalid értéke a XPathNavigator.

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

Feljegyzé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 Schemas tulajdonságában található sémával XmlDocument 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 bemenetként contosoBooks.xsd is szerepel.

<?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 ellenőrzi, hogy a contosoBooks.xml fájl be van-e töltve az XmlDocument objektumba XmlDocument egy érvényesítő XmlReader objektum használatával. 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 bemenetként contosoBooks.xsd is szerepel.

<?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ák az XML-dokumentum betöltése után lettek bevezetve, és az Validate osztály metódusával találták meg őket XmlDocument .

Az osztály metódusával XPathNavigator végrehajtott SetTypedValue 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.

Írásvédett é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 az XPathDocument osztály írásvédett osztály, XPathNavigator az objektumokból XPathDocument visszaadott objektumok nem szerkeszthetik az 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 XPathNavigator és szerkeszthető objektumokról további információt az XML-adatok XPathDocument és XmlDocument használatával című témakörében talál.

Lásd még