4

我试图弄清楚如何使用 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

4 回答 4

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,第二次打印 true

于 2012-07-22T19:50:38.723 回答
3

您只编译了一个 XPath 表达式,并没有实际评估它。

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

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

或使用您的预编译expr

result = expr.evaluate(input);

并且这些evaluate方法还可以将类型作为附加参数,例如XPathConstants.BOOLEAN.

所以这将适用于您inputInputSourceXML:

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

if ((Boolean) retval)
    // edit XML node
于 2012-07-22T19:48:03.333 回答
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] )
于 2012-07-22T23:21:22.710 回答
0

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

于 2012-07-22T19:43:52.287 回答