我有这个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...
}
}
我注意到,通过这个循环,它会遍历所有界面元素的循环。不仅包含application
标签的接口,还包括datatransmit
内的接口。
什么是解决这个问题的方法?
答案 0 :(得分:2)
请参阅javadoc here
getElementsByTagName()
会返回所有后代,因为您调用doc.getElementsByTagName()
,所有doc
的后代都会与元素名称匹配,而不是您的所有后代application
元素
答案 1 :(得分:2)
几乎就在那里。
您的问题是再次使用doc
作为您的root用户:
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...
}
}
答案 2 :(得分: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
这样的路径?
答案 3 :(得分:1)
当您循环遍历document
中的所有元素时,您将获得所有元素。
doc.getElementsByTagName("interface");
您应该从每个application
标记对象中获取元素。