java - DOM 解析器,为什么我只得到一个元素的一个子元素?

标签 java xml dom nodes

我的问题是“DOM 解析器,为什么我只得到一个元素的一个子元素?”

我调查了thisthis一,但我不明白这一点。

我想做的是:

我有一个 XML 文件(请参阅下面的摘录):

<POITEM>
   <item>
      <PO_ITEM>00010</PO_ITEM>
      <SHORT_TEXT>ITEM_A</SHORT_TEXT>
      <MATL_GROUP>20010102</MATL_GROUP>
      <AGREEMENT>4600010076</AGREEMENT>
      <AGMT_ITEM>00010</AGMT_ITEM>
      <HL_ITEM>00000</HL_ITEM>
      <NET_PRICE>1.000000000</NET_PRICE>
      <QUANTITY>1.000</QUANTITY>
      <PO_UNIT>EA</PO_UNIT>
   </item>
   <item>
      <PO_ITEM>00020</PO_ITEM>
      <SHORT_TEXT>ITEM_B</SHORT_TEXT>
      <MATL_GROUP>20010102</MATL_GROUP>
      <AGREEMENT>4600010080</AGREEMENT>
      <AGMT_ITEM>00020</AGMT_ITEM>
      <HL_ITEM>00000</HL_ITEM
      <NET_PRICE>5.000000000</NET_PRICE>
      <QUANTITY>5.000</QUANTITY>
      <PO_UNIT>EA</PO_UNIT>
   </item>
</POITEM>

我只想提取<PO_ITEM>, <SHORT_TEXT>, <MATL_GROUP>, <NET_PRICE>, <QUANTITY><PO_UNIT>并将其写入另一个较小的 XML 文件中。

这是我的代码:

nodes = dcmt.getElementsByTagName("POITEM");

Element rootElement2 = doc1.createElement("PO_POSITIONS");
rootElement1.appendChild(rootElement2);

Element details2 = doc1.createElement("PO_DETAILS");
rootElement2.appendChild(details2);

for (int i = 0; i < nodes.getLength(); i++) {
    Node node = nodes.item(i);
    if (node.getNodeType() == Node.ELEMENT_NODE) {
        Element element = (Element) node;

        Element position = doc1.createElement("position");
        details2.appendChild(position);

        Element poItm = doc1.createElement("PO_ITEM");
        poItm.appendChild(doc1.createTextNode(getValue("PO_ITEM", element)));
        position.appendChild(poItm);

        Element matlGrp = doc1.createElement("MATL_GROUP");
        matlGrp.appendChild(doc1.createTextNode(getValue("MATL_GROUP",element)));
        position.appendChild(matlGrp);

        Element poUnit = doc1.createElement("PO_UNIT");
        poUnit.appendChild(doc1.createTextNode(getValue("PO_UNIT",element)));
        position.appendChild(poUnit);

        Element netPrice = doc1.createElement("NET_PRICE");
        netPrice.appendChild(doc1.createTextNode(getValue("NET_PRICE",element)));
        position.appendChild(netPrice);

        Element shortTxt = doc1.createElement("SHORT_TEXT");
        shortTxt.appendChild(doc1.createTextNode(getValue("SHORT_TEXT",element)));
        position.appendChild(shortTxt);

        //Element matl = doc2.createElement("MATERIAL");
        //matl.appendChild(doc2.createTextNode(getValue("MATERIAL",element)));
        //details2.appendChild(matl);

        Element qnty = doc1.createElement("QUANTITY");
        qnty.appendChild(doc1.createTextNode(getValue("QUANTITY",element)));
        position.appendChild(qnty);

        /*Element preqNr = doc1.createElement("PREQ_NO");
          preqNr.appendChild(doc1.createTextNode(getValue("PREQ_NO",element)));
          details2.appendChild(preqNr); */
    }
}

到目前为止一切顺利,我得到了一个新的 XML 文件,但它只包含第一个条目,据我所知,由 nodes = dcmt.getElementsByTagName("POITEM"); 组成。进入第一个<item>直到第一个</item>然后跳出循环。那么我该如何管理进入下一个项目呢?我是否需要创建某种循环来访问下一个 <item> ? 顺便说一句,更改 XML 文件的结构是不可能的,因为我是从接口(interface)获取文件的。 或者我在编写新的 XML 文件时犯了错误?

输出如下所示:

<PO_POSITIONS>
  <PO_DETAILS>
    <position>
      <PO_ITEM>00010</PO_ITEM>
      <MATL_GROUP>20010102</MATL_GROUP>
      <PO_UNIT>EA</PO_UNIT>
      <NET_PRICE>1.00000000</NET_PRICE>
      <SHORT_TEXT>ITEM_A</SHORT_TEXT>
      <QUANTITY>1.000</QUANTITY>
    </position>
  </PO_DETAILS>
</PO_POSITIONS>

最佳答案

你可以自己解析它,这有点痛苦。当我很久以前做 xml 的时候,我们曾经使用样式表来进行这些类型的转换。像这篇文章一样:How to transform XML with XSL using Java

如果这不是一个选项,那么可以手动完成(我省略了新文档的构建,但您可以看到它的去向):

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XMLTest { 
    @Test
    public void testXmlParsing() throws Exception {
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(new File("/Users/aakture/Documents/workspace-sts-2.9.1.RELEASE/smartfox/branches/trunk/java/gelato/src/test/resources/sample.xml").getAbsolutePath());
        Node poItem = doc.getElementsByTagName("POITEM").item(0);
        NodeList poItemChildren = poItem.getChildNodes();
        for (int i = 0; i < poItemChildren.getLength(); i++) {
            Node item = poItemChildren.item(i);
            NodeList itemChildren = item.getChildNodes();
            for (int j = 0; j < itemChildren.getLength(); j++) {
                Node itemChild = itemChildren.item(j);
                if("PO_ITEM".equals(itemChild.getNodeName())) {
                    System.out.println("found PO_ITEM: " +     itemChild.getTextContent());
                }
                if("MATL_GROUP".equals(itemChild.getNodeName())) {
                    System.out.println("found MATL_GROUP: " + itemChild.getTextContent());
                }

            }
        }
    }
}

关于java - DOM 解析器,为什么我只得到一个元素的一个子元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17966031/

相关文章:

java - 将字符串分解为大写的字符

Java - 等待下载带有部分文件名的文件

java - 将文本文件中的大矩阵加载到 Java 数组中

java - 如何通过 Java 更改 strings.xml 中的值 (Android)

PHP DOM 属性通配符

java - 为什么 ActionEvent.getActionCommand() 返回 null?

html - 为某些 NSXMLElements 保存 NSXMLDocument 转义 HTML

xml - 将 xsl :value-of. .. 放入 CDATA

JavaScript 在 IE8 中不起作用

javascript - 如何将dom元素旋转一定量(纯js)