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.xml
XmlReader.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.xml
XmlReader.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.
- XmlDocument
- XPathDocument
- XPathNavigator
- XPath Veri Modelini Kullanarak XML Verilerini İşleme
- XPathDocument ve XmlDocument Kullanarak XML Verilerini Okuma
- XPathNavigator Kullanarak XML Verileri Seçme, Değerlendirme ve Eşleştirme
- XPathNavigator Kullanarak XML Verilerine Erişme
- XPathNavigator Kullanarak XML Verilerini Düzenleme