2014-05-21 180 views
1

我有這個XML文件:Java的XML解析器環

<root> 
    <application> 
     <interface /> 
     <interface /> 
    </application> 

    <datatransmit> 
     <interface /> 
    </datatransmit> 
</root> 

我所試圖做的是首先做一個遍歷<application>標籤內的接口,然後通過withing的<datatransmit>標籤接口另一個循環。

我試圖與此Java代碼:

NodeList application = doc.getElementsByTagName("application"); 
for (int i = 0; i < application.getLength(); i++) { 
    NodeList interfaces = doc.getElementsByTagName("interface"); 
    for (int j = 0; j < interfaces.getLength(); j++) { 
     do some stuff... 
    } 
} 

我注意到,這個循環,它遍歷所有界面元素的循環。不僅僅是與application標籤的接口,還有datatransmit中的接口。 什麼是解決這個問題的方法?

+0

更換'節點列表界面;'和'節點列表界面=((元)application.get(i))。getElementsByTagName(「interface」);' –

回答

2

快到了。

你的問題是,在再次使用doc作爲根:

NodeList interfaces = doc.getElementsByTagName("interface"); 

這意味着它將搜索整個文檔。相反,你應該在應用元素使用getElementsByTagName方法,以限制搜索的範圍:= doc.getElementsByTagName(「接口」)

NodeList application = doc.getElementsByTagName("application"); 
for (int i = 0; i < application.getLength(); i++) { 
    Element applicationElement = (Element) application.item(i); 
    NodeList interfaces = applicationElement.getElementsByTagName("interface"); 
    for (int j = 0; j < interfaces.getLength(); j++) { 
    do some stuff... 
    } 
} 
1

你需要從這裏application節點列表:

for (int i = 0; i < application.getLength(); i++) { 
    Node appNode = application.item(i); 
    .... 
} 

,並通過getNodeName()檢查節點的名稱/標籤的價值interface

這適用於獲得interface作爲application的子女。如果interface只有application下發生,那麼你可以跳過第一步,只是做

NodeList interfaces = doc.getElementsByTagName("interface"); 

也許更簡潔/靈活的解決方案是使用XPath,以作爲/root/application/interface這樣的路徑?

1

由於您正在翻閱document中的所有元素,因此您將獲得所有元素。

doc.getElementsByTagName("interface");

你應該從每個application標籤對象元素。

2

,查看javadoc here

getElementsByTagName()返回所有後代,既然你叫doc.getElementsByTagName()你匹配的元素的名稱,其中doc所有後代,而不是你的application元素的所有後代