Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 niezdefiniowanego typowo dokumentu XML przy użyciu metody Validate klasy XmlDocument. W obu przypadkach zmiany w zweryfikowanym dokumencie XML można ponownie zweryfikować przy użyciu metody Validate klasy XmlDocument.
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ść ValidationType ustawioną na Schema oraz schemat XML dla dokumentu XML zawartego w obiekcie XmlDocument, który został dodany do jego właściwości Schemas. Następnie weryfikujący obiekt XmlReader jest używany do utworzenia obiektu XmlDocument.
W poniższym przykładzie plik contosoBooks.xml jest weryfikowany podczas ładowania do obiektu XmlDocument poprzez utworzenie obiektu XmlDocument z użyciem obiektu walidującego 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 wykorzystuje się plik contosoBooks.xml 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, gdy zostanie wywołany XmlSchemaValidationException, zostanie zgłoszony Load, jeśli jakikolwiek atrybut lub typ elementu nie zgadza się z odpowiednim typem określonym w schemacie walidacji. ValidationEventHandler Jeśli ValidationEventHandler jest ustawiony na walidującym ValidationEventHandler, zostanie wywołany za każdym razem, gdy zostanie napotkany nieprawidłowy typ.
Rzucony zostanie wyjątek XmlSchemaException, gdy atrybut lub element z ustawioną wartością TypedValue na invalid jest dostępny za pomocą 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 / Notatka
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 właściwość IsEmptyElement zawsze zwraca false dla elementu, który został domyślnie ustawiony przez schemat, nawet jeśli w dokumencie XML został zapisany jako pusty element.
Weryfikowanie dokumentu przy użyciu metody Validate
Metoda Validate klasy XmlDocument weryfikuje dokument XML zawarty w obiekcie XmlDocument względem schematów określonych w właściwości XmlDocument obiektu Schemas i wykonuje rozszerzenie infoset. Wynik to wcześniej nietypowany dokument XML w obiekcie XmlDocument, który został zastąpiony typowanym dokumentem.
Obiekt XmlDocument zgłasza błędy i ostrzeżenia dotyczące weryfikacji schematu, używając delegata ValidationEventHandler, który jest przekazywany jako parametr do metody Validate.
Poniższy przykład sprawdza poprawność pliku contosoBooks.xml zawartego w obiekcie XmlDocument względem schematu zawartego w właściwości contosoBooks.xsd obiektu XmlDocument.
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 wykorzystuje się plik contosoBooks.xml 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ć te modyfikacje względem schematu dokumentu XML, korzystając z metody Validate klasy XmlDocument.
W poniższym przykładzie plik contosoBooks.xml jest weryfikowany podczas ładowania do obiektu XmlDocument poprzez utworzenie obiektu XmlDocument z użyciem obiektu walidującego 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, co powoduje błąd walidacji schematu, a druga modyfikacja ustawia wartość w typowanym węźle na wartość nieprawidłową względem typu węzła, co skutkuje wyjątkiem.
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 wykorzystuje się plik contosoBooks.xml 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 metody SetTypedValue klasy XPathNavigator doprowadziły do 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 .
Read-Only Walidacja
Klasa XPathDocument jest reprezentacją dokumentu XML tylko do odczytu w pamięci. Zarówno klasa XPathDocument, jak i klasa XmlDocument tworzą XPathNavigator obiekty, aby nawigować i edytować dokumenty XML. Ponieważ klasa XPathDocument jest klasą tylko do odczytu, obiekty XPathNavigator zwrócone z obiektów XPathDocument nie mogą modyfikować dokumentu XML zawartego w obiekcie XPathDocument.
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 także
- XmlDocument
- XPathDocument
- XPathNavigator
- Przetwarzanie danych XML przy użyciu modelu danych XPath
- Odczytywanie danych XML przy użyciu elementów XPathDocument i XmlDocument
- Wybieranie, ocenianie 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