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


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

Объект 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 Description Методы
Node set XPathNodeIterator Неупорядоченная коллекция узлов без повторяющихся узлов, созданная в порядке документа. Select или Evaluate
Boolean Boolean Значение true или false. Evaluate или

Matches
Number Double Число с плавающей запятой. Evaluate
String String Последовательность символов UCS. Evaluate

Примечание.

Метод 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.

<?xml version="1.0" encoding="utf-8" ?> 
<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.

См. также