如何使用XPath计数表达式来计算if语句?

时间:2012-07-22 19:29:52

标签: java xml xpath

我正在试图弄清楚如何使用Xpath表达式来验证XPath表达式中只有一个匹配的节点。以下是一些示例XML:

<a>
  <b>
    <c>X:1 Y:0</c>
    <c>X:1 Y:0</c>
    <c>X:2 Y:0</c>
  </b>
  <b>
    <c>X:1 Y:0</c>
    <c>X:2 Y:0</c>
  </b>
</a>

所以,我尝试了与此类似的代码,但它不起作用:

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
try {           
    XPathExpression expr = xpath.compile( "count(//a/b/c)" ) );
} catch ( XPathExpressionException e ) {
    printErr( e );
}
if ( expr == true ) {
  // edit XML node
}

有一种方法可以让count表达式返回一个Boolean = true。我怎么得到这个?

4 个答案:

答案 0 :(得分:9)

也许是这样的:

XPathExpression xpr = xpath.compile("count(//a/b/c)");
System.out.println(xpr.evaluate(n, XPathConstants.NUMBER));

xpr = xpath.compile("count(//a/b/c) = 5");
System.out.println(xpr.evaluate(n, XPathConstants.BOOLEAN));

其中n是文档中的节点/元素

首先打印5.0,第二次打印为真

答案 1 :(得分:3)

您只编译了一个XPath表达式,但实际上并未对其进行评估。

请注意,您可以使用XPath.evaluate()直接评估表达式:

result = xpath.evaluate("count(//a/b/c)", input);

或使用预先编译的expr

result = expr.evaluate(input);

这些evaluate方法也可以作为一个类型的附加参数,例如XPathConstants.BOOLEAN

因此,这将有效,input为您的XML InputSource

XPathExpression expr = xpath.compile("count(//a/b/c) = 5");
Object retval = expr.evaluate(input, XPathConstants.BOOLEAN);

if ((Boolean) retval)
    // edit XML node

答案 2 :(得分:1)

您可以使用

count(//a/b/c) = 1

当且仅当true()评估为count(//a/b/c) - 1时,评估结果为false()

然而,这可能效率不高(导致完整评估XPath表达式并计算所有节点)。

更高效的XPath表达式

(//a/b/c)[1] and not( (//a/b/c)[2] )

答案 3 :(得分:0)

//a/b/c[count(*) != 0]怎么样? 另外如果我记得XPathExpression返回一个Object,你必须转换为原始类型,即xpath Number to Double等。