Java DOM解析器,为什么我只得到元素的一个子元素?
我的问题是“DOM解析器,为什么我只得到元素的一个子元素?” 我看了一遍又一遍,但我不明白重点 我想做的是: 我有一个XML文件(请参阅下面的摘录):Java DOM解析器,为什么我只得到元素的一个子元素?,java,xml,dom,nodes,Java,Xml,Dom,Nodes,我的问题是“DOM解析器,为什么我只得到元素的一个子元素?” 我看了一遍又一遍,但我不明白重点 我想做的是: 我有一个XML文件(请参阅下面的摘录): 你可以自己分析,这有点痛苦。当我很久以前使用xml时,我们使用样式表来进行这些类型的转换。类似这样的帖子: 如果这不是一个选项,那么就手工操作(我省略了新文档的构造,但您可以看到它的发展方向): 导入java.io.File; 导入javax.xml.parsers.DocumentBuilder; 导入javax.xml.parsers.Doc
你可以自己分析,这有点痛苦。当我很久以前使用xml时,我们使用样式表来进行这些类型的转换。类似这样的帖子: 如果这不是一个选项,那么就手工操作(我省略了新文档的构造,但您可以看到它的发展方向):
导入java.io.File;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入org.junit.Test;
导入org.w3c.dom.Document;
导入org.w3c.dom.Node;
导入org.w3c.dom.NodeList;
公共类XMLTest{
@试验
public void testXmlParsing()引发异常{
DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder=dbFactory.newDocumentBuilder();
Document doc=dBuilder.parse(新文件(“/Users/aakture/Documents/workspace-sts-2.9.1.RELEASE/smartfox/branchs/trunk/java/gelto/src/test/resources/sample.xml”).getAbsolutePath();
节点poItem=doc.getElementsByTagName(“poItem”)。项(0);
NodeList poItemChildren=poItem.getChildNodes();
for(int i=0;i
你可以自己解析,这有点痛苦。当我很久以前使用xml时,我们使用样式表来进行这些类型的转换。类似这样的帖子:
如果这不是一个选项,那么就手工操作(我省略了新文档的构造,但您可以看到它的发展方向):
导入java.io.File;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入org.junit.Test;
导入org.w3c.dom.Document;
导入org.w3c.dom.Node;
导入org.w3c.dom.NodeList;
公共类XMLTest{
@试验
public void testXmlParsing()引发异常{
DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder=dbFactory.newDocumentBuilder();
Document doc=dBuilder.parse(新文件(“/Users/aakture/Documents/workspace-sts-2.9.1.RELEASE/smartfox/branchs/trunk/java/gelto/src/test/resources/sample.xml”).getAbsolutePath();
节点poItem=doc.getElementsByTagName(“poItem”)。项(0);
NodeList poItemChildren=poItem.getChildNodes();
for(int i=0;i
因为您的XML和代码不匹配,所以很难弄清楚发生了什么。@Stephen C好的,为什么?我的问题是,我只返回第一个
的属性。我在nodes=dcmt.getElementsByTagName(“POITEM”)部分看到了问题。我从中得到一个XML文件,它包含第一个
,但不包含第二个,第三个,依此类推。你没有得到它。XML不包含名为“POITEM”的元素。。。因此,程序不可能像您描述的那样运行。请提供适当的SSCE和适当的输入,而不是一些毫无意义的乱七八糟的东西。我们看不懂你的心思。哦,对不起。我现在明白我的错误了。好的,我将提供实际XML文件的摘录。因为XML和代码不匹配,所以很难弄清楚到底发生了什么。@Stephen C好的,为什么?我的问题是,我只返回第一个
的属性。我在nodes=dcmt.getElementsByTagName(“POITEM”)部分看到了问题。我从中得到一个XML文件,它包含第一个
,但不包含第二个,第三个,依此类推。你没有得到它。XML不包含名为“POITEM”的元素。。。因此,程序不可能像您描述的那样运行。请提供适当的SSCE和适当的输入,而不是一些毫无意义的乱七八糟的东西。我们看不懂你的心思。哦,对不起。我现在明白我的错误了。好的,我将提供实际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>
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); */
}
}
<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>
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());
}
}
}
}
}