2012-07-18 59 views
1

我需要找到的東西通過ID遞歸XML節點是這樣的:JAVA XML,發現遞歸

<categories> 
    <category id="1"> 
    </category> 
    <category id="2"> 
    <category id="3"> 
    </category> 
    <category id="4"> 
     <category id="5"> 
     </category> 
    </category> 
    </category> 
</categories> 

我使用DocBuilder。

我知道有方法getElementById(),但它不適用於我的情況,我們可以說,當我在根節點中時,我想要查找帶有id="5"的元素。

可能嗎?

+0

'getElementById()'搜索整個文檔,而不僅僅是一個元素的子節點。如果你有一個指定屬性是'xml:id'的模式,它應該做你想要的。 (看到這個問題:http://stackoverflow.com/questions/3423430/java-xml-dom-how-are-id-attributes-special) – millimoose 2012-07-18 16:18:46

回答

0

爲什麼不這樣做下面的僞代碼

FindChild(parent, id) 
{ 

    if(parent.getChildById(id)) return parent.getChildById(id); 

    foreach(parent.child) 
    { 
     Element found = FindChild(child, id); 
     if(found) return found; 
    } 

    return NULL; 
} 

你必須決定如何處理的情況下做的元素與指定的ID在幾個地方出現在層次結構(即返回第一次出現或建立一個列表)

1

調用方法與根節點:

Element element = getElementById(rootElement, "5"); 

和遞歸方法:

public Element getElementById(Element element, String desiredId){ 
    if(desiredId.equals(element.getAttribute("id"))) 
     return element; 
    for(int i=0; i < element.getChildNodes().getLength(); i++){ 
     Node node = element.getChildNodes().item(i); 
     if (node.getNodeType() == Node.ELEMENT_NODE){ 
      Element child = getElementById((Element) node, desiredId); 
      if(child != null) 
       return child; 
     } 
    } 
    return null; 
} 
+0

但是,這種方法是不是遞歸的...它不會更深入比第一個孩子... – Ilkar 2012-07-18 18:34:40

+0

我測試了代碼,它的工作原理! – elias 2012-07-18 20:22:39