我正在试图弄清楚如何使用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。我怎么得到这个?
答案 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等。