Java xml解析器循环

时间:2014-05-21 09:57:14

标签: java xml dom saxparser

我有这个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内的接口。 什么是解决这个问题的方法?

4 个答案:

答案 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标记对象中获取元素。