【问题标题】:Java xml parser loopJava xml解析器循环
【发布时间】:2014-05-21 09:57:13
【问题描述】:

我有这个 xml 文件:

<root>
    <application>
        <interface />
        <interface />
    </application>

    <datatransmit>
        <interface />
    </datatransmit>
</root>

我要做的是首先通过&lt;application&gt; 标签内的接口循环,然后再循环通过带有&lt;datatransmit&gt; 标签的接口。

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

【问题讨论】:

  • NodeList interfaces = ((Element) application.get(i)).getElementsByTagName("interface");替换NodeList interfaces = doc.getElementsByTagName("interface");

标签: java xml dom saxparser


【解决方案1】:

差不多了。

您的问题是再次使用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...
  }
}

【讨论】:

    【解决方案2】:

    参见 javadoc here

    getElementsByTagName() 返回所有后代,并且由于您调用doc.getElementsByTagName(),您将获得与元素名称匹配的doc 的所有后代,而不是您的application 元素的所有后代

    【讨论】:

      【解决方案3】:

      您需要从这里获取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

      【讨论】:

        【解决方案4】:

        当您遍历来自document 的所有元素时,您将获得所有元素。

        doc.getElementsByTagName("interface");

        您应该从每个application 标记对象中获取元素。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-14
          • 1970-01-01
          • 1970-01-01
          • 2020-11-21
          • 2021-04-23
          • 1970-01-01
          • 2014-06-18
          • 1970-01-01
          相关资源
          最近更新 更多