[英]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.