Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
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