Ověření schématu pomocí XPathNavigator
XmlDocument Pomocí třídy můžete ověřit obsah XML obsažený v objektu XmlDocument dvěma způsoby. Prvním způsobem je ověření obsahu XML pomocí validujícího XmlReader objektu a druhým způsobem je použít Validate metodu XmlDocument třídy. Pomocí třídy můžete také provádět ověřování obsahu XPathDocument XML jen pro čtení.
Ověřování dat XML
Třída XmlDocument neověřuje dokument XML pomocí ověřování schématu DTD nebo XML schema definition language (XSD) ve výchozím nastavení. Ověřuje pouze, že je dokument XML správně vytvořený.
Prvním způsobem, jak ověřit dokument XML, je ověřit dokument při jeho načtení do XmlDocument objektu pomocí validujícího XmlReader objektu. Druhým způsobem je ověření dříve nezatypovaného dokumentu XML pomocí Validate metody XmlDocument třídy. V obou případech je možné změny ověřeného dokumentu XML znovu aktualizovat pomocí Validate metody XmlDocument třídy.
Ověření dokumentu při načtení
Validační XmlReader objekt je vytvořen předáním XmlReaderSettings objektu Create metodě XmlReader třídy, která přebírá XmlReaderSettings objekt jako parametr. Objekt XmlReaderSettings předaný jako parametr má vlastnost nastavenou ValidationType na Schema
a schématu XML pro dokument XML obsažený v objektu přidaný XmlDocument do jeho Schemas vlastnosti. Objekt ověřování XmlReader se pak použije k vytvoření objektu XmlDocument .
Následující příklad ověří contosoBooks.xml
soubor při jeho načtení do XmlDocument objektu vytvořením objektu XmlDocument pomocí validujícího XmlReader objektu. Vzhledem k tomu, že dokument XML je platný podle schématu, nevygenerují se žádné chyby nebo upozornění ověření schématu.
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;
}
}
}
Příklad vezme contosoBooks.xml
soubor jako vstup.
<?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>
Příklad také přebírá contosoBooks.xsd
jako vstup.
<?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>
V předchozím příkladu XmlSchemaValidationException bude vyvolána Load při zavolání, pokud některý atribut nebo typ prvku neodpovídá odpovídajícímu typu zadanému v ověřovacím schématu. ValidationEventHandler Pokud je nastavena na ověřování XmlReader, ValidationEventHandler bude volána při každém zjištění neplatného typu.
Vyvolá XmlSchemaException se při atributu nebo elementu s TypedValue nastavenou nastavenou invalid
XPathNavigatorvlastností .
Vlastnost Validity lze použít k určení, zda je jednotlivý atribut nebo prvek platný při přístupu k atributům nebo prvků pomocí XPathNavigator.
Poznámka:
Při načtení dokumentu XML do objektu XmlDocument s přidruženým schématem, které definuje výchozí hodnoty, objekt považuje tyto výchozí hodnoty za to, XmlDocument jako by se zobrazily v dokumentu XML. To znamená, že IsEmptyElement vlastnost vždy vrací false
pro prvek, který byl výchozí ze schématu, i když v dokumentu XML byl zapsán jako prázdný prvek.
Ověření dokumentu pomocí metody Validate
Validate Metoda XmlDocument třídy ověřuje dokument XML obsažený v objektu XmlDocument proti schématům zadaným ve XmlDocument vlastnosti objektu Schemas a provádí rozšíření infoset. Výsledkem je dříve netypovaný dokument XML v objektu XmlDocument nahrazený typem dokumentu.
Objekt XmlDocument hlásí chyby a upozornění ověřování schématu pomocí delegáta předaného ValidationEventHandler jako parametr metody Validate .
Následující příklad ověří contosoBooks.xml
soubor obsažený v objektu XmlDocument proti schématu contosoBooks.xsd
obsaženému ve vlastnosti objektu XmlDocumentSchemas .
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;
}
}
}
Příklad vezme contosoBooks.xml
soubor jako vstup.
<?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>
Příklad také přebírá contosoBooks.xsd
jako vstup.
<?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>
Ověřování změn
Po provedení změn dokumentu XML můžete pomocí metody XmlDocument třídy ověřit změny ve schématu dokumentu Validate XML.
Následující příklad ověří contosoBooks.xml
soubor při jeho načtení do XmlDocument objektu vytvořením objektu XmlDocument pomocí validujícího XmlReader objektu. Dokument XML se úspěšně ověří, protože se načte, aniž by se vygenerovaly chyby nebo upozornění ověření schématu. Příklad pak provede dvě úpravy dokumentu XML, které jsou neplatné podle schématu contosoBooks.xsd
. První úprava vloží neplatný podřízený prvek, který vede k chybě ověření schématu, a druhá úprava nastaví hodnotu zadaného uzlu na hodnotu, která je neplatná podle typu uzlu, což vede k výjimce.
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;
}
}
}
Příklad vezme contosoBooks.xml
soubor jako vstup.
<?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>
Příklad také přebírá contosoBooks.xsd
jako vstup.
<?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>
V příkladu výše jsou provedeny dvě úpravy dokumentu XML obsaženého v objektu XmlDocument . Při načítání dokumentu XML by všechny zjištěné chyby ověření schématu byly zpracovány metodou obslužné rutiny události ověření a zapsány do konzoly.
V tomto příkladu byly chyby ověření zavedeny po načtení dokumentu XML a byly nalezeny pomocí Validate metody XmlDocument třídy.
Změny provedené pomocí SetTypedValue metody XPathNavigator třídy způsobily InvalidCastException , že nová hodnota byla neplatná podle typu schématu uzlu.
Další informace o úpravě SetTypedValue hodnot pomocí metody naleznete v tématu Upravit data XML pomocí XPathNavigator téma.
Ověřování jen pro čtení
Třída XPathDocument je reprezentace dokumentu XML jen pro čtení v paměti. Třída XPathDocument i třída vytvářejí XPathNavigator objekty pro navigaci a úpravu XmlDocument dokumentů XML. Vzhledem k tomu, že XPathDocument třída je třída určená jen pro čtení, XPathNavigator nemůže objekt vrácený z XPathDocument objektů upravovat dokument XML obsažený v objektu XPathDocument .
V případě ověření můžete vytvořit XPathDocument objekt stejně jako vytvořit XmlDocument objekt pomocí ověřovacího XmlReader objektu, jak je popsáno výše v tomto tématu. Objekt XPathDocument ověří dokument XML při jeho načtení, ale protože nelze upravit data XML v objektu XPathDocument , nelze znovu obnovit dokument XML.
Další informace o objektech jen pro čtení a úpravách XPathNavigator naleznete v tématu Čtení dat XML pomocí XPathDocument a XmlDocument tématu.