Java XPATH:将xml节点插入到另一个xml文档中
我尝试将XML文档中的一组节点插入到某个节点的另一个节点中。 我遵循提供的答案 但我不知道为什么,所有的属性值都会在导入中删除 有什么想法吗? 唐斯克很多 根据要求,以下是我使用的XML示例: XML1 最后,我得到的结果如下:Java XPATH:将xml节点插入到另一个xml文档中,java,xml,xpath,Java,Xml,Xpath,我尝试将XML文档中的一组节点插入到某个节点的另一个节点中。 我遵循提供的答案 但我不知道为什么,所有的属性值都会在导入中删除 有什么想法吗? 唐斯克很多 根据要求,以下是我使用的XML示例: XML1 最后,我得到的结果如下: <letterContent> <key1>key1</key1> <key2>key2</key2> <type>456</type> <obje
<letterContent>
<key1>key1</key1>
<key2>key2</key2>
<type>456</type>
<object1>789</object1>
<effectiveDate>00</effectiveDate>
<expandedData attr1="case1">
<expandedData attr2="value2">
<data attrD="VD2">value D2</data>
</expandedData>
<expandedData attr3="value3">
<data attrD="vd3">value D3</data>
</expandedData>
<expandedData attr4="">
<data attrd4="">value d4</data>
<name nameattr=""/>
</expandedData>
</expandedData
</letterContent>
关键1
键2
456
789
00
值D2
值D3
值d4
根据以下文件的Javadoc:
元素节点
采用源元素的指定属性节点。默认属性将被丢弃,但如果采用的文档定义了此元素名称的默认属性,则会分配这些属性。递归地采用源元素的后代
默认情况下,将丢弃属性,这就是添加节点
时不添加属性的原因。与选项一起使用deep=true
允许您保留所有属性:
e1.appendChild(doc1.importNode(e2, true));
结果:
<letterContent>
...
<expandedData attr1="case1">
...
<expandedData attr4="value4">
<data attrd4="vd4">value d4</data>
<name nameattr="specific_name"/>
</expandedData>
</expandedData>
</letterContent>
...
...
值d4
非常感谢您。它工作得很好。顺便说一句,感谢w3c链接:这是找到解决方案的入口。@Zamboo不客气。我很高兴能够提供帮助:)
package org.test.XMLMERGE;
import static javax.xml.xpath.XPathConstants.*;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.*;
import org.w3c.dom.*;
import org.xml.sax.InputSource;
public class Xml2into1 {
public static void main(String[] args) throws Exception {
// read from files
InputSource xml1 = new InputSource("R:/java/dev/tmp/dest.xml");
InputSource xml2 = new InputSource("R:/java/dev/tmp/orig2.xml");
// find the node to add to
XPath xpath = XPathFactory.newInstance()
.newXPath();
Node e1 = (Node) xpath.evaluate("//expandedData[@attr1='case1']", xml1, NODE);
Document doc1 = e1.getOwnerDocument();
// insert the nodes
Node e2 = (Node) xpath.evaluate("//expandedData[@attr4='value4']", xml2, NODE);
e1.appendChild(doc1.adoptNode(e2));
//.replaceChild(doc1.adoptNode(expandedData2), expandedData1);
// print results
TransformerFactory.newInstance()
.newTransformer()
.transform(new DOMSource(doc1), new StreamResult(System.out));
}
}
<letterContent>
<key1>key1</key1>
<key2>key2</key2>
<type>456</type>
<object1>789</object1>
<effectiveDate>00</effectiveDate>
<expandedData attr1="case1">
<expandedData attr2="value2">
<data attrD="VD2">value D2</data>
</expandedData>
<expandedData attr3="value3">
<data attrD="vd3">value D3</data>
</expandedData>
<expandedData attr4="">
<data attrd4="">value d4</data>
<name nameattr=""/>
</expandedData>
</expandedData
</letterContent>
e1.appendChild(doc1.importNode(e2, true));
<letterContent>
...
<expandedData attr1="case1">
...
<expandedData attr4="value4">
<data attrd4="vd4">value d4</data>
<name nameattr="specific_name"/>
</expandedData>
</expandedData>
</letterContent>