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


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

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

Замечание

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

Свойство ReturnType

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

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

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

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. Выражение //book XPath сканирует каждый узел в дереве XML, чтобы определить соответствующие узлы.

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

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

См. также