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


Скомпилированные выражения XPath

Обновлен: November 2007

Объект XPathExpression представляет скомпилированный запрос XPath, возвращаемый либо статическим методом Compile класса XPathExpression, либо методом Compile класса XPathNavigator.

Класс XPathExpression

Скомпилированный запрос XPath, представляемый объектом XPathExpression полезен в случаях, когда один запрос XPath используется несколько раз.

Например, если метод Select вызывается несколько раз, то вместо многократного использования строки, представляющей запрос XPath, используйте метод Compile класса XPathExpression или метод Compile класса XPathNavigator, чтобы скомпилировать запрос XPath и поместить его в кэш в объекте XPathExpression для повторного использования и повышения производительности.

Скомпилированный объект XPathExpression можно использовать как входной аргумент для следующих методов класса XPathNavigator в зависимости от типа, возвращаемого запросом XPath.

В следующей таблице описаны возвращаемые типы W3C XPath и их эквиваленты в платформе Microsoft .NET Framework, а также методы, с которыми можно использовать объект XPathExpression в зависимости от возвращаемого им типа.

Возвращаемый тип W3C XPath

Эквивалентный тип в .NET Framework

Описание

Методы

Node set

XPathNodeIterator

Неупорядоченная коллекция узлов без повторяющихся узлов, созданная в порядке документа.

Select или Evaluate

Boolean

Boolean

Значение true или false.

Evaluate или

Matches

Number

Double

Число с плавающей запятой.

Evaluate

String

String

Последовательность символов UCS.

Evaluate

093b7219.alert_note(ru-ru,VS.90).gifПримечание.

Метод Matches принимает в качестве параметра выражение XPath. Метод SelectSingleNode возвращает объект XPathNavigator, а не один из возвращаемых типов W3C XPath.

Свойство ReturnType

После компиляции запроса XPath в объект XPathExpression можно использовать свойство ReturnType объекта XPathExpression, чтобы определить возвращаемый тип запроса XPath.

Свойство ReturnType возвращает одно из следующих значений перечисления XPathResultType, представляющего возвращаемые типы W3C XPath.

В следующем примере используется объект XPathExpression, чтобы вернуть число и набор узлов из файла books.xml. Свойство ReturnType каждого объекта XPathExpression, а также результаты методов Evaluate и Select записываются в консоль.

Dim document As XPathDocument = New XPathDocument("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()

' Returns a number.
Dim query1 As XPathExpression = navigator.Compile("bookstore/book/price/text()*10")
Console.WriteLine(query1.ReturnType)

Dim number As Double = CType(navigator.Evaluate(query1), Double)
Console.WriteLine(number)

' Returns a node set.
Dim query2 As XPathExpression = navigator.Compile("bookstore/book/price")
Console.WriteLine(query2.ReturnType)

Dim nodes As XPathNodeIterator = navigator.Select(query2)
nodes.MoveNext()
Console.WriteLine(nodes.Current.Value)
XPathDocument document = new XPathDocument("books.xml");
XPathNavigator navigator = document.CreateNavigator();
            
// Returns a number.
XPathExpression query1 = navigator.Compile("bookstore/book/price/text()*10");
Console.WriteLine(query1.ReturnType);
            
Double number = (Double)navigator.Evaluate(query1);
Console.WriteLine(number);

// Returns a node set.
XPathExpression query2 = navigator.Compile("bookstore/book/price");
Console.WriteLine(query2.ReturnType);
            
XPathNodeIterator nodes = navigator.Select(query2);
nodes.MoveNext();
Console.WriteLine(nodes.Current.Value);

В примере в качестве входных данных используется файл books.xml.

<bookstore>
    <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>

Выражения XPath повышенной производительности

Для повышения производительности используйте в запросах по возможности наиболее точно заданные выражения XPath. Например, если узел book является дочерним для узла bookstore, а узел bookstore является элементом верхнего уровня в XML-документе, то использование выражения XPath /bookstore/book обеспечит скорость большую, чем использование выражения //book. Выражение XPath //book будет просматривать каждый узел в XML-дереве для определения совпадающих узлов.

Кроме того, использование методов перемещения по набору узлов, предоставляемых классом XPathNavigator, может повысить производительность по сравнению с методами выбора, предоставляемыми классом XPathNavigator, в случаях с простыми критериями выбора. Например, если нужно выбрать первый дочерний узел текущего узла, быстрее использовать метод MoveToFirst, чем выражение XPath child::*[1] и метод Select.

Дополнительные сведения о методах перемещения по набору узлов в классе XPathNavigator см. в разделе Навигация в наборе узлов с помощью XPathNavigator.

См. также

Основные понятия

Обработка XML-данных с использованием модели данных XPath

Выборка XML-данных с помощью XPathNavigator

Вычисление выражения XPath с помощью класса XPathNavigator

Соответствие узлов с помощью XPathNavigator

Типы узлов, распознаваемые запросами XPath

Запросы XPath и пространства имен

Ссылки

XmlDocument

XPathDocument

XPathNavigator