【问题标题】:Java DOM parsing not working for deep xml structureJava DOM 解析不适​​用于深层 xml 结构
【发布时间】:2017-02-03 16:25:43
【问题描述】:

Java 代码

       XPathExpression readOcc = xpath.compile("//flexTM/attrGroupMany[contains(@name,'allergenRelatedInformation')]");
       Object rObj = (Object) readOcc.evaluate(doc,XPathConstants.NODESET);
       NodeList agm = (NodeList) rObj;



        System.out.println("" + agm.getLength());

        for (int i=0; i<agm.getLength(); i++){
                Element element = (Element) agm.item(i).getChildNodes();
                NodeList row = element.getElementsByTagName("row");
                 System.out.println("row len " + row.getLength());

                 for(int j=0;j<row.getLength(); j++){
                     Element eAttr = (Element) row.item(j);
                     System.out.println(eAttr.getNodeName());
                     NodeList attr = eAttr.getElementsByTagName("attrGroupMany");

                     for (int k=0;k<attr.getLength();k++){
                         Element eAgm = (Element) attr.item(k);
                         System.out.println(eAgm.getNodeName());
                         NodeList iattr = eAgm.getChildNodes();
                         System.out.println(iattr.getLength());
                         System.out.println(iattr.item(1).getNodeValue());
                         //NodeList iattr = eAgm.getElementsByTagName("row");

                         for(int l=0;i<iattr.getLength();l++){
                             Element iAttr = (Element) iattr.item(l);
                             System.out.println(iAttr.getNodeName());

                             //System.out.println(iAttr.getNodeValue());
                         }

                     }
                 }

XML

<item>

<attrGroupMany name="manufacturer">
              <row>
                 <attr name="gln">7689</attr>
                 <attr name="name">XYZ Inc</attr>
              </row>
           </attrGroupMany>
           <attrGroupMany name="allergenRelatedInformation">
              <row>
                 <attr name="allergenSpecificationAgency">FDA</attr>
                 <attr name="allergenSpecificationName">BIG 8</attr>
                 <attrGroupMany name="allergen">
                    <row>
                       <attr name="allergenTypeCode">AC</attr>
                       <attr name="levelOfContainmentCode">FREE_FROM</attr>
                    </row>
                 </attrGroupMany>
              </row>
              <row>
                 <attr name="allergenSpecificationAgency">FDA</attr>
                 <attr name="allergenSpecificationName">BIG 8</attr>
                 <attrGroupMany name="allergen">
                    <row>
                       <attr name="allergenTypeCode">AE</attr>
                       <attr name="levelOfContainmentCode">FREE_FROM</attr>
                    </row>
                 </attrGroupMany>
              </row>
              <row>
                 <attr name="allergenSpecificationAgency">FDA</attr>
                 <attr name="allergenSpecificationName">BIG 8</attr>
                 <attrGroupMany name="allergen">
                    <row>
                       <attr name="allergenTypeCode">AF</attr>
                       <attr name="levelOfContainmentCode">FREE_FROM</attr>
                    </row>
                 </attrGroupMany>
              </row>
              <row>
                 <attr name="allergenSpecificationAgency">FDA</attr>
                 <attr name="allergenSpecificationName">BIG 8</attr>
                 <attrGroupMany name="allergen">
                    <row>
                       <attr name="allergenTypeCode">AM</attr>
                       <attr name="levelOfContainmentCode">FREE_FROM</attr>
                    </row>
                 </attrGroupMany>
              </row>


           </attrGroupMany>
    </item>
 <item>

<attrGroupMany name="manufacturer">
              <row>
                 <attr name="gln">7689</attr>
                 <attr name="name">XYZ Inc</attr>
              </row>
           </attrGroupMany>
           <attrGroupMany name="allergenRelatedInformation">
              <row>
                 <attr name="allergenSpecificationAgency">FDA</attr>
                 <attr name="allergenSpecificationName">BIG 8</attr>
                 <attrGroupMany name="allergen">
                    <row>
                       <attr name="allergenTypeCode">AC</attr>
                       <attr name="levelOfContainmentCode">FREE_FROM</attr>
                    </row>
                 </attrGroupMany>
              </row>
              <row>
                 <attr name="allergenSpecificationAgency">FDA</attr>
                 <attr name="allergenSpecificationName">BIG 8</attr>
                 <attrGroupMany name="allergen">
                    <row>
                       <attr name="allergenTypeCode">AE</attr>
                       <attr name="levelOfContainmentCode">FREE_FROM</attr>
                    </row>
                 </attrGroupMany>
              </row>
              <row>
                 <attr name="allergenSpecificationAgency">FDA</attr>
                 <attr name="allergenSpecificationName">BIG 8</attr>
                 <attrGroupMany name="allergen">
                    <row>
                       <attr name="allergenTypeCode">AF</attr>
                       <attr name="levelOfContainmentCode">FREE_FROM</attr>
                    </row>
                 </attrGroupMany>
              </row>
              <row>
                 <attr name="allergenSpecificationAgency">FDA</attr>
                 <attr name="allergenSpecificationName">BIG 8</attr>
                 <attrGroupMany name="allergen">
                    <row>
                       <attr name="allergenTypeCode">AM</attr>
                       <attr name="levelOfContainmentCode">FREE_FROM</attr>
                    </row>
                 </attrGroupMany>
              </row>


           </attrGroupMany>
    </item>

在上面的 XML 中,有 2 个项目标签,每个标签都有自己的节点 attrGroupMany,属性为 allergenRelatedInformation。我正在尝试解析每个级别的 xml,以便我可以打印父节点和子节点的所有值。不确定我上面的代码有什么问题,它失败了。

【问题讨论】:

  • 您应该考虑递归执行此操作。
  • “失败了” 描述不充分。请访问help center 并阅读How to Ask 以了解如何有效地使用本网站。
  • 我有理由不递归循环。有人可以指出我的代码有什么问题吗?谢谢
  • 永远不要告诉我们某事“失败”或“不工作”而不告诉我们它是如何失败的。
  • for(int j=0;j 下打印行元素的数量。但看起来它正在考虑 下的偶数行。

标签: java xml dom


【解决方案1】:

我建议您避免直接使用org.w3c.dom.* 类,因为您最终得到的代码可能难以阅读和维护。您可以编写一个类层次结构并使用 JAXB 将 xml 放入其中,这是通用的 Java 方法。

或者,如果您希望更直接地使用它,但可以使用库Dynamics

让我给你一个使用它的例子。假设 xml 是有效的,即有一个父元素,假设称为“数据”。您的文档将如下所示。

<data>
  <item>
    <!-- contents as you specified -->
  </item>
  <item>
    <!-- contents as you specified -->
  </item>
</data>

XmlDynamic 实例可让您以直接的 null 安全方式遍历结构,但具有相同的功能和直接性。

让我们获取第二个项目的第一个'attr'名称属性

XmlDynamic allergenInfo = new XmlDynamic(xmlStringOrReaderOrInputSourceEtc);

String firstAttrName = allergenInfo
    .get("data|item[1]|attrGroupMany|row|attr|@name")
    .asString(); // gln

或者查看整个文档并打印属性名称和值

allergenInfo.allChildren()
    .filter(hasElementName("attr")) // import static alexh.weak.XmlDynamic.hasElementName
    .filter(attr -> attr.get("@name").isPresent())
    .forEach(attr -> System.out.println(attr.get("@name").asString() + " -> " + attr.asString()));
// prints all attr names -> values

这是一个单一且轻量级的额外依赖,即在 maven 中:

<dependency>
  <groupId>com.github.alexheretic</groupId>
  <artifactId>dynamics</artifactId>
  <version>4.0</version>
</dependency>

查看更多示例https://github.com/alexheretic/dynamics#xml-dynamics

【讨论】:

  • 我用 JDOM 修复了它
猜你喜欢
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2012-11-18
  • 2012-01-10
  • 1970-01-01
  • 2011-07-28
相关资源
最近更新 更多