Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В качестве экземпляра модели данных XPath 2.0, класс XPathNavigator может содержать строго типизированные данные, которые сопоставляются с типами общей языковой среды выполнения (CLR). Согласно модели данных XPath 2.0, только элементы и атрибуты могут содержать строго типизированные данные. Класс XPathNavigator предоставляет механизмы доступа к данным внутри XPathDocument или XmlDocument объекта как строго типизированные данные, а также механизмы преобразования из одного типа данных в другой.
Тип информации, открываемый XPathNavigator
Данные XML 1.0 технически не имеют типа, если их не обрабатывают с помощью DTD, схемы языка определения XML (XSD) или других механизмов. Существует ряд категорий сведений типа, которые могут быть связаны с XML-элементом или атрибутом.
Простые типы CLR: ни один из языков схемы XML не поддерживает типы CLR напрямую. Так как полезно просматривать простое содержимое элемента и атрибута как наиболее подходящий тип CLR, всё простое содержимое можно рассматривать как String, когда отсутствует информация о схеме, а любая добавленная информация схемы может уточнять это содержимое, чтобы соответствовать более подходящему типу. С помощью свойства ValueType можно найти наиболее подходящий тип CLR для простого элемента и содержимого атрибута. Дополнительные сведения о сопоставлении встроенных типов схемы с типами CLR см. в разделе "Поддержка типов" в классах System.Xml.
Списки простых типов (CLR): элемент или атрибут с простым содержимым может содержать список значений, разделенных пробелами. Значения задаются XML-схемой как "тип списка". В отсутствие xml-схемы такой простой контент будет рассматриваться как один текстовый узел. Когда схема XML доступна, это простое содержимое может быть представлено в виде ряда атомарных значений, каждый из которых имеет простой тип, который сопоставляется с коллекцией объектов CLR. Дополнительные сведения о сопоставлении встроенных типов схемы с типами CLR см. в разделе "Поддержка типов" в классах System.Xml.
Типизированное значение: атрибут или элемент с простым типом, проверенный по схеме, имеет типизированное значение. Это значение является примитивным типом, например числовым, строковым или типом даты. Все встроенные простые типы в XSD можно сопоставить с типами СРЕДЫ CLR, предоставляющими доступ к значению узла в качестве более подходящего типа, а не как.String Элемент с атрибутами или дочерними элементами считается сложным типом. Типизированное значение сложного типа с простым содержимым (только текстовые узлы как дочерние) совпадает с простым типом его содержимого. Типизированное значение сложного типа со сложным содержимым (одним или несколькими дочерними элементами) — строковое значение объединения всех дочерних текстовых узлов, возвращаемых в виде String. Дополнительные сведения о сопоставлении встроенных типов схемы с типами CLR см. в разделе "Поддержка типов" в классах System.Xml.
Schema-Language Имя Конкретного Типа: в большинстве случаев типы CLR, которые задаются при применении внешней схемы, используются для предоставления доступа к значению узла. Однако могут возникнуть ситуации, когда может потребоваться проверить тип, связанный с определенной схемой, применяемой к XML-документу. Например, вы можете выполнить поиск по XML-документу, извлекая все элементы, которые определяются содержимым типа "PurchaseOrder" в соответствии с присоединенной схемой. Такие сведения о типе можно задать только в результате проверки схемы, и этот доступ осуществляется через свойства класса XmlTypeSchemaInfo. Дополнительные сведения см. в разделе послепроверочного информационного набора схемы (PSVI) ниже.
Schema-Language отражение конкретного типа. В других случаях может потребоваться получить дополнительные сведения о типе, применяемом к XML-документу. Например, при чтении XML-файла может потребоваться извлечь
maxOccurs
атрибут для каждого допустимого узла в XML-документе, чтобы выполнить некоторые пользовательские вычисления. Так как эти сведения задаются только с помощью проверки схемы, доступ к нему осуществляется через SchemaInfo свойство XPathNavigator класса. Дополнительные сведения см. в разделе послепроверочного информационного набора схемы (PSVI) ниже.
Типизированные аксессоры XPathNavigator
В следующей таблице показаны различные свойства и методы XPathNavigator класса, которые можно использовать для доступа к сведениям о типе узла.
Недвижимость | Описание |
---|---|
XmlType | Это содержит сведения о типе схемы XML для узла, если он действителен. |
SchemaInfo | Это содержит информационный набор после проверки схемы узла, который добавляется после проверки. Сюда входят сведения о типе схемы XML, а также сведения о действительности. |
ValueType | Тип CLR типизированного значения узла. |
TypedValue | Содержимое узла в виде одного или нескольких значений CLR, тип которых наиболее соответствует типу схемы XML узла. |
ValueAsBoolean | Значение String текущего узла, приведенное к значению Boolean, в соответствии с правилами xs:boolean приведения XPath 2.0. |
ValueAsDateTime | Значение String текущего узла, приведенное к значению DateTime, в соответствии с правилами xs:datetime приведения XPath 2.0. |
ValueAsDouble | Значение String текущего узла, приведенное к значению Double, в соответствии с правилами xsd:double приведения XPath 2.0. |
ValueAsInt | Значение String текущего узла, приведенное к значению Int32, в соответствии с правилами xs:integer приведения XPath 2.0. |
ValueAsLong | Значение String текущего узла, приведенное к значению Int64, в соответствии с правилами xs:integer приведения XPath 2.0. |
ValueAs | Содержимое узла приводится к целевому типу по правилам приведения XPath 2.0. |
Дополнительные сведения о сопоставлении встроенных типов схемы с типами CLR см. в разделе "Поддержка типов" в классах System.Xml.
Набор сведений о проверке схемы после публикации (PSVI)
Обработчик схемы XML принимает набор сведений XML в качестве входных данных и преобразует его в набор сведений о проверке после схемы (PSVI). PSVI — это исходный набор входных XML-сведений с новыми элементами информации, добавленными и новыми свойствами, добавленными к существующим элементам информации. Существует три широких класса информации, добавленных в набор XML-сведений в PSVI, которые предоставляются XPathNavigator.
Результаты проверки. Сведения о том, был ли элемент или атрибут успешно проверен или нет. Это определяется свойством Validity свойства SchemaInfo класса XPathNavigator.
Сведения по умолчанию: указывает, было ли получено значение элемента или атрибута с помощью значений по умолчанию, указанных в схеме. Это определяется свойством IsDefault свойства SchemaInfo класса XPathNavigator.
Аннотации типов: ссылки на компоненты схемы, которые могут быть определениями типов или объявлениями элементов и атрибутов. Свойство XmlTypeXPathNavigator содержит сведения о конкретном типе узла, если он действителен. Если неизвестна действительность узла, например, если узел был утвержден, а затем отредактирован. Затем свойству XmlType присваивается значение
null
, но информация о типе по-прежнему доступна из различных свойств свойства SchemaInfo класса XPathNavigator.
В следующем примере показано использование сведений в наборе сведений о проверке схемы после валидации, предоставленным XPathNavigator.
Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.Schemas.Add("http://www.contoso.com/books", "books.xsd")
settings.ValidationType = ValidationType.Schema
Dim reader As XmlReader = XmlReader.Create("books.xml", settings)
Dim document As XmlDocument = New XmlDocument()
document.Load(reader)
Dim navigator As XPathNavigator = document.CreateNavigator()
navigator.MoveToChild("books", "http://www.contoso.com/books")
navigator.MoveToChild("book", "http://www.contoso.com/books")
navigator.MoveToChild("published", "http://www.contoso.com/books")
Console.WriteLine(navigator.SchemaInfo.SchemaType.Name)
Console.WriteLine(navigator.SchemaInfo.Validity)
Console.WriteLine(navigator.SchemaInfo.SchemaElement.MinOccurs)
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://www.contoso.com/books", "books.xsd");
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create("books.xml", settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
XPathNavigator navigator = document.CreateNavigator();
navigator.MoveToChild("books", "http://www.contoso.com/books");
navigator.MoveToChild("book", "http://www.contoso.com/books");
navigator.MoveToChild("published", "http://www.contoso.com/books");
Console.WriteLine(navigator.SchemaInfo.SchemaType.Name);
Console.WriteLine(navigator.SchemaInfo.Validity);
Console.WriteLine(navigator.SchemaInfo.SchemaElement.MinOccurs);
Пример принимает файл books.xml
в качестве входных данных.
<books xmlns="http://www.contoso.com/books">
<book>
<title>Title</title>
<price>10.00</price>
<published>2003-12-31</published>
</book>
</books>
Пример также принимает схему books.xsd
в качестве входных данных.
<xs:schema xmlns="http://www.contoso.com/books"
attributeFormDefault="unqualified" elementFormDefault="qualified"
targetNamespace="http://www.contoso.com/books"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="publishedType">
<xs:restriction base="xs:date">
<xs:minInclusive value="2003-01-01" />
<xs:maxInclusive value="2003-12-31" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="bookType">
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="price" type="xs:decimal"/>
<xs:element name="published" type="publishedType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="booksType">
<xs:sequence>
<xs:element name="book" type="bookType" />
</xs:sequence>
</xs:complexType>
<xs:element name="books" type="booksType" />
</xs:schema>
Получение типизированных значений с помощью свойств valueAs
Типизированное значение узла можно получить путем доступа к свойству TypedValue в XPathNavigator. В некоторых случаях может потребоваться преобразовать типизированное значение узла в другой тип. Типичным примером является получение числового значения из XML-узла. Например, рассмотрим следующий неоцененный и нетипизированный XML-документ.
<books>
<book>
<title>Title</title>
<price>10.00</price>
<published>2003-12-31</published>
</book>
</books>
Если XPathNavigator расположен на элементе price
, то свойство XmlType будет null
, свойство ValueType будет String, а свойство TypedValue будет строкой 10.00
.
Однако можно извлечь значение в числовом формате с помощью метода и свойств ValueAs, ValueAsDouble, ValueAsInt или ValueAsLong. В следующем примере показано, как выполнить такое приведение типа с использованием метода ValueAs.
Dim document As New XmlDocument()
document.Load("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
navigator.MoveToChild("books", "")
navigator.MoveToChild("book", "")
navigator.MoveToChild("price", "")
Dim price = navigator.ValueAs(GetType(Decimal))
Dim discount As Decimal = 0.2
Console.WriteLine("The price of the book has been dropped 20% from {0:C} to {1:C}", navigator.Value, (price - price * discount))
XmlDocument document = new XmlDocument();
document.Load("books.xml");
XPathNavigator navigator = document.CreateNavigator();
navigator.MoveToChild("books", "");
navigator.MoveToChild("book", "");
navigator.MoveToChild("price", "");
Decimal price = (decimal)navigator.ValueAs(typeof(decimal));
Console.WriteLine("The price of the book has been dropped 20% from {0:C} to {1:C}", navigator.Value, (price - price * (decimal)0.20));
Дополнительные сведения о сопоставлении встроенных типов схемы с типами CLR см. в разделе "Поддержка типов" в классах System.Xml.