Weryfikacja schematu przy użyciu klasy XPathNavigator
XmlDocument Za pomocą klasy można zweryfikować zawartość XML zawartą XmlDocument w obiekcie na dwa sposoby. Pierwszym sposobem jest zweryfikowanie zawartości XML przy użyciu obiektu sprawdzania poprawności XmlReader , a drugą Validate metodą jest użycie metody XmlDocument klasy. Można również przeprowadzić walidację zawartości XML tylko do odczytu przy użyciu XPathDocument klasy .
Weryfikowanie danych XML
Klasa XmlDocument domyślnie nie weryfikuje dokumentu XML przy użyciu walidacji schematu DTD lub XML schema definition language (XSD). Sprawdza tylko, czy dokument XML jest poprawnie sformułowany.
Pierwszym sposobem weryfikacji dokumentu XML jest zweryfikowanie dokumentu podczas ładowania go do XmlDocument obiektu przy użyciu obiektu sprawdzania poprawności XmlReader . Drugim sposobem jest zweryfikowanie wcześniej nietypowego dokumentu XML przy użyciu Validate metody XmlDocument klasy. W obu przypadkach zmiany w zweryfikowanym dokumencie XML można cofnąć przy użyciu Validate metody XmlDocument klasy .
Weryfikowanie dokumentu podczas ładowania
Obiekt sprawdzania poprawności XmlReader jest tworzony przez przekazanie XmlReaderSettings obiektu do Create metody XmlReader klasy , która przyjmuje XmlReaderSettings obiekt jako parametr. XmlReaderSettings Obiekt przekazany jako parametr ma właściwość ustawioną ValidationType na Schema
i schemat XML dla dokumentu XML zawartego XmlDocument w obiekcie dodanym do jego Schemas właściwości. Następnie do utworzenia XmlDocument obiektu jest używany weryfikowanie XmlReader obiektu.
W poniższym przykładzie plik jest weryfikowany contosoBooks.xml
podczas ładowania do XmlDocument obiektu przez utworzenie XmlDocument obiektu przy użyciu obiektu sprawdzania poprawności XmlReader . Ponieważ dokument XML jest prawidłowy zgodnie ze schematem, nie są generowane żadne błędy weryfikacji schematu ani ostrzeżenia.
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;
}
}
}
W przykładzie plik jest contosoBooks.xml
pobierany jako dane wejściowe.
<?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>
Przykład przyjmuje contosoBooks.xsd
również jako dane wejściowe.
<?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>
W powyższym przykładzie element zostanie zgłoszony, XmlSchemaValidationException gdy Load zostanie wywołany, jeśli jakikolwiek atrybut lub typ elementu nie jest zgodny z odpowiednim typem określonym w schemacie sprawdzania poprawności. ValidationEventHandler Jeśli element jest ustawiony na walidację XmlReader, element zostanie wywołany za każdym razem, ValidationEventHandler gdy wystąpi nieprawidłowy typ.
Element XmlSchemaException zostanie zgłoszony, gdy do atrybutu lub elementu z ustawionym elementem TypedValueinvalid
jest uzyskiwany dostęp za pomocą elementu XPathNavigator.
Właściwość Validity może służyć do określenia, czy dany atrybut lub element jest prawidłowy podczas uzyskiwania dostępu do atrybutów lub elementów za pomocą elementu XPathNavigator.
Uwaga
Gdy dokument XML jest ładowany do XmlDocument obiektu ze skojarzonym schematem, który definiuje wartości domyślne, XmlDocument obiekt traktuje te wartości domyślne tak, jakby były wyświetlane w dokumencie XML. Oznacza to, że IsEmptyElement właściwość zawsze zwraca false
element, który został domyślny ze schematu, nawet jeśli w dokumencie XML został zapisany jako pusty element.
Weryfikowanie dokumentu przy użyciu metody Validate
Metoda ValidateXmlDocument klasy weryfikuje dokument XML zawarty w XmlDocument obiekcie względem schematów określonych we XmlDocument właściwości obiektu Schemas i wykonuje rozszerzenie infoset. Wynik jest wcześniej nietypowym dokumentem XML w XmlDocument obiekcie zastąpionym typem dokumentu.
Obiekt XmlDocument zgłasza błędy weryfikacji schematu i ostrzeżenia przy użyciu ValidationEventHandler delegata przekazanego jako parametr do Validate metody.
Poniższy przykład sprawdza poprawność pliku zawartego XmlDocument w obiekcie względem schematu zawartego contosoBooks.xsd
XmlDocument we właściwości obiektuSchemas.contosoBooks.xml
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;
}
}
}
W przykładzie plik jest contosoBooks.xml
pobierany jako dane wejściowe.
<?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>
Przykład przyjmuje contosoBooks.xsd
również jako dane wejściowe.
<?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>
Weryfikowanie modyfikacji
Po wprowadzeniu modyfikacji dokumentu XML można zweryfikować modyfikacje schematu dokumentu XML przy użyciu Validate metody XmlDocument klasy .
W poniższym przykładzie plik jest weryfikowany contosoBooks.xml
podczas ładowania do XmlDocument obiektu przez utworzenie XmlDocument obiektu przy użyciu obiektu sprawdzania poprawności XmlReader . Dokument XML jest weryfikowany pomyślnie, ponieważ jest ładowany bez generowania błędów weryfikacji schematu lub ostrzeżeń. W tym przykładzie wprowadzono dwie modyfikacje dokumentu XML, które są nieprawidłowe zgodnie ze schematem contosoBooks.xsd
. Pierwsza modyfikacja wstawia nieprawidłowy element podrzędny powodujący błąd weryfikacji schematu, a druga modyfikacja ustawia wartość wpisana węzeł na wartość nieprawidłową zgodnie z typem węzła, co powoduje wyjątek.
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;
}
}
}
W przykładzie plik jest contosoBooks.xml
pobierany jako dane wejściowe.
<?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>
Przykład przyjmuje contosoBooks.xsd
również jako dane wejściowe.
<?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>
W powyższym przykładzie do dokumentu XML zawartego XmlDocument w obiekcie są wprowadzane dwie modyfikacje. Podczas ładowania dokumentu XML wszystkie napotkane błędy weryfikacji schematu byłyby obsługiwane przez metodę obsługi zdarzeń weryfikacji i zapisane w konsoli programu obsługi.
W tym przykładzie błędy walidacji zostały wprowadzone po załadowaniu dokumentu XML i zostały znalezione przy użyciu Validate metody XmlDocument klasy .
Modyfikacje wprowadzone przy użyciu SetTypedValue metody XPathNavigator klasy spowodowały wystąpienie, InvalidCastException ponieważ nowa wartość była nieprawidłowa zgodnie z typem schematu węzła.
Aby uzyskać więcej informacji na temat modyfikowania wartości przy użyciu SetTypedValue metody, zobacz temat Modyfikowanie danych XML przy użyciu klasy XPathNavigator .
Walidacja tylko do odczytu
Klasa XPathDocument jest reprezentacją dokumentu XML tylko do odczytu w pamięci. Zarówno klasa, jak XPathDocumentXmlDocument i klasa tworzą XPathNavigator obiekty, aby nawigować i edytować dokumenty XML. XPathDocument Ponieważ klasa jest klasą tylko do odczytu, XPathNavigator obiekty zwrócone z XPathDocument obiektów nie mogą edytować dokumentu XML zawartego XPathDocument w obiekcie.
W przypadku walidacji można utworzyć XPathDocument obiekt tak samo jak w przypadku tworzenia XmlDocument obiektu przy użyciu obiektu sprawdzania poprawności XmlReader zgodnie z opisem we wcześniejszej części tego tematu. Obiekt XPathDocument sprawdza poprawność dokumentu XML podczas jego ładowania, ale ponieważ nie można edytować danych XML w XPathDocument obiekcie, nie można ponownie zmienić dokumentu XML.
Aby uzyskać więcej informacji na temat obiektów tylko do odczytu i edytowalnych XPathNavigator , zobacz temat Odczytywanie danych XML przy użyciu dokumentów XPathDocument i XmlDocument .
Zobacz też
- XmlDocument
- XPathDocument
- XPathNavigator
- Przetwarzanie danych XML przy użyciu modelu danych XPath
- Wczytywanie danych XML przy użyciu klas XPathDocument i XmlDocument
- Wybieranie, obliczanie i dopasowywanie danych XML przy użyciu klasy XPathNavigator
- Uzyskiwanie dostępu do danych XML przy użyciu klasy XPathNavigator
- Edytowanie danych XML przy użyciu klasy XPathNavigator