Скомпилированные выражения 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.
См. также
- XmlDocument
- XPathDocument
- XPathNavigator
- Обработка XML-данных с использованием модели данных XPath
- Выборка XML-данных с помощью XPathNavigator
- Вычисление выражения XPath с помощью класса XPathNavigator
- Соответствие узлов с помощью XPathNavigator
- Типы узлов, распознаваемые запросами XPath
- Запросы XPath и пространства имен