簡體   English   中英

Java xml解析器循環

[英]Java xml parser loop

我有這個xml文件:

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

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

我想做的是首先通過<application>標記內的接口進行循環,然后通過帶有<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...
    }
}

我注意到,通過此循環,它經歷了所有接口元素的循環。 不僅僅是接口withing的application標簽,但也內的接口datatransmit 有什么辦法可以解決這個問題?

這里查看javadoc

getElementsByTagName()返回所有后代 ,並且由於您調用doc.getElementsByTagName()您將獲得與元素名稱匹配的所有doc后代,而不是application元素的所有后代

就快到了。

您的問題是在以下位置再次使用doc作為根目錄:

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

這意味着它將搜索整個文檔。 相反,您應該在應用程序元素上使用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...
  }
}

您需要從此處獲取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類的路徑?

當您瀏覽document所有元素時,您將獲得所有元素。

doc.getElementsByTagName("interface");

您應該從每個application標記對象中獲取元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM