2012-06-11 3 views
0

특정 이름을 가진 xml 요소의 수를 얻고 싶습니다. 이름 = "하면서")dom4j-java- 특정 요소 이름을 가진 루트 내의 모든 요소 (부모 또는 자식)를 얻는 방법

문제는 그 다음 코드 코드를 사용하는 경우 요소가 아니다 "동안"나는 단지이

 for (Iterator i = root.elementIterator("while"); i.hasNext();) { 
      Element foo = (Element) i.next(); 

을 환난이 최상위 요소 그러나 어떤 낮은 수준을 얻을 수 있다는 것입니다 iterator의 일부 ...

name = "while"인 모든 요소 (최상위 수준이든 하위 수준이든)를 얻는 가장 효율적인 방법은 무엇입니까? 이 목적을 위해 문서의 모든 요소를 ​​파싱해야합니까?

+0

는 사용할 수 없습니다 [element.getElementsByTagName (문자열)] (HTTP ://dom4j.sourceforge.net/dom4j-1.6.1/apidocs/apiocs/org/dom4j/dom/DOMElement.html#getElementsByTagName%28java.lang.String%29)? 나는 그 이름을 가진 모든 요소를 ​​나에게 주었다고 확신한다. 내가 원하지 않는 어떤 것. – TikkaBhuna

답변

1

당신은 그 사용 //while 또는 name() 기능과 와일드 카드 노드 *에 대한 XPath를 사용할 수 있습니다 //*[name() = 'while']

List list = document.selectNodes("//*[name() = 'while']"); // or "//while" 
int numberOfNodes = list.size(); 
for (Iterator iter = list.iterator(); iter.hasNext();) { 
    // do something 
} 
+0

문서에 name =이라는 요소가 있는지 먼저 확인하려면 어떻게해야합니까? – Arvind

+0

내 업데이트보기 – Alex

+0

'while'노드를 보유하고있는 List에서 'size()'를 호출하면됩니다. – Alex

0

요소 반복자는 XPATH에서 다음 단계에 대해서만 작동합니다. 모든 XML을 파싱하고 모든 Element를 얻으려면 재귀를 사용해야합니다. 예를 들어 다음 코드는 "이름"모든 노드의 목록을 반환합니다

public List<Element> getElementsByName(String name, Element parent, List<Element> elementList) 
{ 
    if (elementList == null) 
     elementList = new ArrayList<Element>(); 

    for (Iterator i = parent.elementIterator(); i.hasNext();) { 
     Element current = (Element) i.next(); 
     if (current.getName().equalsIgnoreCase(name)) 
     { 
      elementList.add(current); 
     } 

     getElementsByName(name, current, elementList); 
    } 
    return elementList; 
} 
0

이 정규식은 나를 위해 일한 :

document.selectNodes(".//*") 
관련 문제