Aracılığıyla paylaş


XPathNavigator Kullanarak Şema Doğrulama

sınıfını XmlDocument kullanarak, bir XmlDocument nesnede bulunan XML içeriğini iki şekilde doğrulayabilirsiniz. İlk yol, doğrulayıcı XmlReader bir nesne kullanarak XML içeriğini doğrulamak ve ikinci yol da sınıfının yöntemini XmlDocument kullanmaktırValidate. Sınıfını kullanarak XML içeriğinin salt okunur doğrulamasını XPathDocument da gerçekleştirebilirsiniz.

XML Verilerini Doğrulama

sınıfı, XmlDocument varsayılan olarak DTD veya XML şema tanım dili (XSD) şema doğrulamasını kullanarak xml belgesini doğrulamaz. Yalnızca XML belgesinin iyi biçimlendirilmiş olduğunu doğrular.

XML belgesini doğrulamanın ilk yolu, belgeyi doğrulama XmlReader nesnesi kullanılarak bir XmlDocument nesneye yüklenirken doğrulamaktır. İkinci yol, sınıfının yöntemini kullanarak Validate önceden yazılmamış bir XML belgesini doğrulamaktır XmlDocument . Her iki durumda da, doğrulanmış XML belgesindeki değişiklikler sınıfının yöntemi XmlDocument kullanılarak Validate yeniden doğrulanabilir.

Belge yüklendikçe doğrulanıyor

XmlReader Doğrulama nesnesi, bir XmlReaderSettings nesneyi parametre olarak alan sınıfın XmlReader yöntemine Create geçirilerek XmlReaderSettings oluşturulur. XmlReaderSettings Parametre olarak geçirilen nesnenin özelliği olarak ayarlanmış ve özelliğine Schema eklenen Schemas nesnede XmlDocument bulunan XML belgesi için xml şeması varValidationType. Daha sonra nesneyi oluşturmak XmlDocument için doğrulayıcı XmlReader nesne kullanılır.

Aşağıdaki örnek, dosyayı nesneye yüklenirken doğrulayan bir nesne kullanarak nesnesi oluşturarak XmlDocument doğrular contosoBooks.xmlXmlReader.XmlDocument XML belgesi şemasına göre geçerli olduğundan, şema doğrulama hataları veya uyarıları oluşturulmaz.

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

Örnek, dosyayı giriş olarak alır contosoBooks.xml .

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

Örnek, giriş olarak da alır contosoBooks.xsd .

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

Yukarıdaki örnekte, herhangi bir öznitelik veya öğe türü doğrulama şemasında belirtilen karşılık gelen türle eşleşmiyorsa çağrıldığında Load bir XmlSchemaValidationException oluşturulur. ValidationEventHandler doğrulanırken XmlReaderValidationEventHandler ayarlanırsa, geçersiz bir türle karşılaşıldığında çağrılır.

XmlSchemaException olarak ayarlanmış invalid bir öznitelik veya öğe TypedValue tarafından XPathNavigatorerişildiğinde bir oluşturulur.

Validity özelliği ile XPathNavigatorözniteliklere veya öğelere erişirken tek bir özniteliğin veya öğenin geçerli olup olmadığını belirlemek için kullanılabilir.

Not

Xml belgesi, varsayılan değerleri tanımlayan ilişkili şemaya sahip bir XmlDocument nesneye yüklendiğinde, XmlDocument nesne bu varsayılan değerleri XML belgesinde göründükleri gibi değerlendirir. Bu, XML belgesinde IsEmptyElement boş bir öğe olarak yazılmış olsa bile, özelliğin her zaman şemadan varsayılan olarak alınan bir öğe için döndürdüğü false anlamına gelir.

Validate Yöntemini Kullanarak Belgeyi Doğrulama

Validate sınıfının yöntemiXmlDocument, nesnenin özelliğinde belirtilen şemalara karşı bir XmlDocument nesnede XmlDocumentSchemas bulunan XML belgesini doğrular ve infoset büyütme gerçekleştirir. Sonuç, nesnede XmlDocument daha önce yazılmamış bir XML belgesidir ve bu belge, yazılan bir belgeyle değiştirilir.

nesnesi, XmlDocument yönteme parametre olarak geçirilen temsilciyi ValidationEventHandler kullanarak şema doğrulama hatalarını ve uyarılarını Validate bildirir.

Aşağıdaki örnek, nesnenin contosoBooks.xml özelliğinde XmlDocument bulunan şemaya contosoBooks.xsd göre nesnenin XmlDocumentSchemas içerdiği dosyayı doğrular.

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

Örnek, dosyayı giriş olarak alır contosoBooks.xml .

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

Örnek, giriş olarak da alır contosoBooks.xsd .

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

Değişiklikleri Doğrulama

Xml belgesinde değişiklikler yapıldıktan sonra, xml belgesinin şemasında yapılan değişiklikleri sınıfın XmlDocument yöntemini kullanarak Validate doğrulayabilirsiniz.

Aşağıdaki örnek, dosyayı nesneye yüklenirken doğrulayan bir nesne kullanarak nesnesi oluşturarak XmlDocument doğrular contosoBooks.xmlXmlReader.XmlDocument XML belgesi, şema doğrulama hataları veya uyarıları oluşturmadan yüklendiğinden başarıyla doğrulanır. Örnek daha sonra XML belgesinde şemaya contosoBooks.xsd göre geçersiz olan iki değişiklik yapar. İlk değişiklik geçersiz bir alt öğe ekler ve şema doğrulama hatasıyla sonuçlanır ve ikinci değişiklik türü belirtilen düğümün değerini bir özel durumla sonuçlanan düğümün türüne göre geçersiz bir değere ayarlar.

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

Örnek, dosyayı giriş olarak alır contosoBooks.xml .

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

Örnek, giriş olarak da alır contosoBooks.xsd .

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

Yukarıdaki örnekte, nesnesinde bulunan XML belgesinde XmlDocument iki değişiklik yapılmıştır. XML belgesi yüklenirken, karşılaşılan tüm şema doğrulama hataları doğrulama olay işleyici yöntemi tarafından işlenip konsola yazılmış olabilir.

Bu örnekte, XML belgesi yüklendikten ve sınıfı yöntemi XmlDocument kullanılarak Validate bulunduktan sonra doğrulama hataları ortaya çıkmıştır.

Sınıfının yöntemi kullanılarak SetTypedValue yapılan değişiklikler, yeni değerin XPathNavigator düğümün şema türüne göre geçersiz olması nedeniyle bir InvalidCastException ile sonuçlandı.

yöntemini kullanarak SetTypedValue değerleri değiştirme hakkında daha fazla bilgi için XPathNavigator kullanarak XML Verilerini Değiştirme konusuna bakın.

Salt Okunur Doğrulama

XPathDocument sınıfı, xml belgesinin salt okunur, bellek içi bir gösterimidir. XPathDocument Hem sınıfı hem XmlDocument de sınıfı, XML belgelerinde gezinmek ve belgeleri düzenlemek için nesneler oluştururXPathNavigator. XPathDocument Sınıf salt okunur bir sınıf olduğundan nesnenin nesneden XPathDocument döndürülenleri nesnenin XPathNavigator içerdiği XPathDocument XML belgesini düzenleyemez.

Doğrulama durumunda, bu konuda daha önce açıklandığı gibi bir doğrulayıcı XmlReader nesne kullanarak nesne oluşturduğunuz gibi bir nesne oluşturabilirsiniz.XPathDocumentXmlDocument XPathDocument Nesne, XML belgesini yüklendikçe doğrular, ancak nesnedeki XPathDocument XML verilerini düzenleyemediğiniz için XML belgesini yeniden doğrulayamazsınız.

Salt okunur ve düzenlenebilir XPathNavigator nesneler hakkında daha fazla bilgi için XPathDocument ve XmlDocument kullanarak XML Verilerini Okuma konusuna bakın.

Ayrıca bkz.