2012-07-22 5 views
4

XPath 식에 일치하는 노드가 하나만 있는지 확인하기 위해 Xpath 식을 사용하는 방법을 알아 내려고합니다. 다음은 몇 가지 샘플 XML입니다 : =XPath 수식을 사용하여 if 문을 평가하려면 어떻게해야합니까?

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 
} 

가정으로 부울을 반환 카운트 표현을위한 방법이 : 그래서

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

,이 유사한 코드를 시도했지만 작동하지 않습니다 사실. 어떻게해야합니까?

답변

9
이 같은

아마 뭔가 : n은

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)); 

문서에서 노드/요소

첫 번째 인쇄 5.0, 초 인쇄

+0

몇 가지 문제가 예에서 "n"을 처리하는 방법을 알아내는 데. – djangofan

+0

죄송합니다. 파일을 파싱 할 때 Document를 얻는다. XPath 표현식을 사용하여 특정 노드를 얻거나 document.getDocumentElement()를 호출하면된다. 'DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); doc = builder.parse (새 파일 (파일 이름)); 노드 n = doc.getDocumentElement(); ' – Kennet

+0

작품!Kennet에게 감사드립니다 !! – JRichardsz

0

//a/b/c[count(*) != 0]? 또한 XPathExpression이 Object를 반환한다는 것을 기억합니다. 즉, xpath Number to Double 등의 기본 유형으로 변환해야합니다.

3

XPath 표현식 만 컴파일 했으므로 실제로 평가하지 않았습니다. 당신이 식을 계산할 수

참고 직접 XPath.evaluate()를 사용하여 :

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

또는 사용하여 미리 컴파일 된 expr :

result = expr.evaluate(input); 

그리고이 evaluate 방법은 또한 추가 인수 A와 걸릴 수 있습니다 유형은 XPathConstants.BOOLEAN입니다.

그래서 당신의 XML에 대한 InputSourceinput으로 작동합니다

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 

count(//a/b/c)1로 평가의 경우에만 true()로 평가 - 그렇지 않으면 false().

그러나 이는 효율적이지 않을 수 있습니다 (XPath 표현식을 완전히 평가하고 모든 노드를 계산합니다).

보다 효율적으로 XPath 식 :

(//a/b/c)[1] and not((//a/b/c)[2]) 
관련 문제