Поделиться через


Доступ к строго типизированным XML-данным с помощью XPathNavigator

В качестве экземпляра модели данных 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.

  1. Результаты проверки. Сведения о том, был ли элемент или атрибут успешно проверен или нет. Это определяется свойством Validity свойства SchemaInfo класса XPathNavigator.

  2. Сведения по умолчанию: указывает, было ли получено значение элемента или атрибута с помощью значений по умолчанию, указанных в схеме. Это определяется свойством IsDefault свойства SchemaInfo класса XPathNavigator.

  3. Аннотации типов: ссылки на компоненты схемы, которые могут быть определениями типов или объявлениями элементов и атрибутов. Свойство 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.

См. также