繁体   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