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