Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
XmlDocument С помощью класса можно проверить XML-содержимое, содержащееся в объекте XmlDocument двумя способами. Первым способом является проверка XML-содержимого с помощью проверяющего XmlReader объекта, а второй способ — использовать Validate метод XmlDocument класса. Можно также выполнить проверку XML-содержимого только для чтения с помощью XPathDocument класса.
Проверка XML-данных
Класс XmlDocument по умолчанию не выполняет проверку XML-документа с использованием схемы DTD или схемы XML (XSD). Он проверяет, правильно ли формируется XML-документ.
Первым способом проверки XML-документа является проверка документа при его загрузке в XmlDocument объект с помощью проверяющего XmlReader объекта. Второй способ — проверить ранее нетипизированный XML-документ с помощью Validate метода XmlDocument класса. В обоих случаях изменения в проверенном XML-документе можно пересмотреть с помощью Validate метода XmlDocument класса.
Проверка документа при загрузке
Проверяющий XmlReader объект создается путем передачи XmlReaderSettings объекта методу Create класса, который принимает XmlReader объект XmlReaderSettings в качестве параметра. Объект XmlReaderSettings, переданный в качестве параметра, имеет свойство ValidationType, установленное на Schema
, и XML-схему для XML-документа, содержащегося в объекте XmlDocument, добавленную в его свойство Schemas. Затем проверяющий XmlReader объект используется для создания XmlDocument объекта.
Следующий пример проверяет файл contosoBooks.xml
в процессе его загрузки в объект XmlDocument путем создания объекта XmlDocument с использованием объекта XmlReader для валидации. Так как XML-документ действителен в соответствии с его схемой, ошибки проверки схемы или предупреждения не создаются.
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;
}
}
}
Пример принимает 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>
Пример также принимает 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>
В приведенном выше примере будет выброшено XmlSchemaValidationException, когда вызывается Load, если какой-либо атрибут или тип элемента не соответствует соответствующему типу, указанному в проверяющей схеме. Если для проверяющегоValidationEventHandler задано XmlReader, ValidationEventHandler будет вызываться всякий раз, когда обнаружен недопустимый тип.
Будет вызвано исключение, когда к атрибуту или элементу с установленным значением XmlSchemaException доступ осуществляется через TypedValue.
Свойство Validity можно использовать для определения того, является ли отдельный атрибут или элемент действительным при доступе к атрибутам или элементам с помощью XPathNavigator.
Замечание
При загрузке XML-документа в объект со связанной XmlDocument схемой, определяющей значения по умолчанию, XmlDocument объект обрабатывает эти значения по умолчанию, как если бы они появились в XML-документе. Это означает, что IsEmptyElement свойство всегда возвращает false
для элемента, установленного по умолчанию в схеме, даже если в XML-документе он записан как пустой элемент.
Проверка документа с помощью метода Validate
Метод ValidateXmlDocument класса проверяет XML-документ, содержащийся в объекте, на основе схем, указанных в XmlDocumentXmlDocument свойстве объекта Schemas , и выполняет расширение набора сведений. Результатом является ранее нетипизированный XML-документ в XmlDocument объекте, замененный типизированным документом.
Объект XmlDocument сообщает об ошибках проверки схемы и предупреждениях, используя делегат, ValidationEventHandler переданный в качестве параметра методу Validate .
В следующем примере файл contosoBooks.xml
, содержащийся в XmlDocument объекте, проверяется на соответствие схеме contosoBooks.xsd
, содержащейся в свойстве XmlDocument объекта Schemas.
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;
}
}
}
Пример принимает 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>
Пример также принимает 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>
Проверка изменений
После внесения изменений в XML-документ можно проверить изменения в схеме XML-документа с помощью Validate метода XmlDocument класса.
Следующий пример проверяет файл contosoBooks.xml
в процессе его загрузки в объект XmlDocument путем создания объекта XmlDocument с использованием объекта XmlReader для валидации. XML-документ проверяется успешно, так как он загружается без создания ошибок проверки схемы или предупреждений. Затем этот пример вносит два изменения в XML-документ, недопустимый в соответствии с схемой contosoBooks.xsd
. Первое изменение вставляет недопустимый дочерний элемент, в результате чего возникает ошибка проверки схемы, а вторая модификация задает значение типизированного узла в недопустимое значение в соответствии с типом узла, что приводит к исключению.
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;
}
}
}
Пример принимает 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>
Пример также принимает 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>
В приведенном выше примере два изменения вносятся в XML-документ, содержащийся в объекте XmlDocument . По мере загрузки XML-документа все ошибки проверки схемы, возникшие, были бы обработаны методом обработчика событий проверки и записаны в консоль.
В этом примере ошибки проверки были введены после загрузки XML-документа и были найдены с помощью Validate метода XmlDocument класса.
Изменения, внесенные с помощью метода SetTypedValue класса XPathNavigator, привели к тому, что произошло InvalidCastException, так как новое значение оказалось недопустимым по типу схемы узла.
Дополнительные сведения об изменении значений SetTypedValue с помощью метода см. в разделе "Изменение XML-данных с помощью XPathNavigator ".
Read-Only проверка
Класс XPathDocument — это представление XML-документа только для чтения в памяти. Классы XPathDocument и XmlDocument создают объекты XPathNavigator для навигации и редактирования XML-документов. Поскольку класс XPathDocument является классом только для чтения, объекты XPathNavigator, возвращаемые из объектов XPathDocument, не могут изменить XML-документ, содержащийся в объекте XPathDocument.
В случае проверки можно создать XPathDocument объект так же, как и создать XmlDocument объект, используя проверяющий XmlReader объект, как описано ранее в этом разделе. Объект XPathDocument проверяет XML-документ по мере его загрузки, но поскольку невозможно изменить XML-данные в объекте XPathDocument , невозможно повторно изменить XML-документ.
Дополнительные сведения о доступных только для чтения и редактируемых XPathNavigator объектах см. в разделе "Чтение XML-данных с помощью XPathDocument и XmlDocument ".
См. также
- XmlDocument
- XPathDocument
- XPathNavigator
- Обработка XML-данных с помощью модели данных XPath
- Чтение XML-данных с помощью XPathDocument и XmlDocument
- Выбор, оценка и сопоставление XML-данных с помощью XPathNavigator
- Доступ к XML-данным с помощью XPathNavigator
- Редактирование XML-данных с помощью XPathNavigator