2012-07-22 100 views
4

我想弄清楚如何使用Xpath表達式來驗證在XPath表達式中只有一個匹配節點。下面是一些示例XML:如何使用XPath計數表達式來評估if語句?

<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 
} 

有所謂的計數表達式返回布爾的方式=真的。我如何得到這個?

回答

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,第二張印刷品爲真

+0

遇到了一些麻煩搞清楚如何處理您的例子中,「N」。 – djangofan 2012-07-22 20:48:14

+0

對不起。當您解析文件時,您將獲得一個Document,您可以使用XPath表達式來獲取某個節點,或者只需調用document.getDocumentElement()。 'DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); doc = builder.parse(new File(filename)); 節點n = doc.getDocumentElement();' – Kennet 2012-07-23 07:22:44

+0

作品!感謝Kennet! – JRichardsz 2016-06-28 21:02:52

0

//a/b/c[count(*) != 0]怎麼樣? 也如果我記得XPathExpression返回一個對象,你將不得不將其轉換爲一個原始類型,即xpath數字雙等

3

你只編譯了一個XPath表達式,你沒有實際評估它。

注意,您可以計算表達式直接使用XPath.evaluate()

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

或使用預編譯expr

result = expr.evaluate(input); 

而且這些evaluate方法也可以作爲額外的參數一類型,如XPathConstants.BOOLEAN

那麼這將工作,以input作爲InputSource爲XML:

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

if ((Boolean) retval) 
    // edit XML node 
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])