使用 XPathNavigator 评估 XPath 表达式

XPathNavigator 类提供 Evaluate 用于计算 XPath 表达式的方法。 该方法 Evaluate 采用 XPath 表达式,计算它,并根据 XPath 表达式的结果返回布尔值、数字、字符串或节点集的 W3C XPath 类型。

Evaluate 方法

该方法Evaluate采用 XPath 表达式,对其进行计算,并返回布尔值()、数字(BooleanDouble)、字符串(String)或节点集()XPathNodeIterator的类型化结果。 例如,该方法 Evaluate 可用于数学方法。 以下示例代码计算文件中所有书籍 books.xml 的总价格。

Dim document As XPathDocument = New XPathDocument("books.xml")  
Dim navigator As XPathNavigator = document.CreateNavigator()  
  
Dim query As XPathExpression = navigator.Compile("sum(//price/text())")  
Dim total As Double = CType(navigator.Evaluate(query), Double)  
Console.WriteLine(total)  
XPathDocument document = new XPathDocument("books.xml");  
XPathNavigator navigator = document.CreateNavigator();  
  
XPathExpression query = navigator.Compile("sum(//price/text())");  
Double total = (Double)navigator.Evaluate(query);  
Console.WriteLine(total);  

该示例将 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>

position 和 last 函数

Evaluate 方法被重载了。 其中 Evaluate 一种方法采用对象 XPathNodeIterator 作为参数。 此特定 Evaluate 方法与 Evaluate 仅使用对象 XPathExpression 作为参数的方法相同,只不过它允许节点集参数指定当前上下文以执行计算。 XPath position()last() 函数需要此上下文,因为它们相对于当前上下文节点。 除非在位置步骤中用作谓词,否则 position()last() 函数需要引用节点集才能进行计算,否则 positionlast 函数会返回 0

另请参阅