Java XPATH:将xml节点插入到另一个xml文档中

Java XPATH:将xml节点插入到另一个xml文档中,java,xml,xpath,Java,Xml,Xpath,我尝试将XML文档中的一组节点插入到某个节点的另一个节点中。 我遵循提供的答案 但我不知道为什么,所有的属性值都会在导入中删除 有什么想法吗? 唐斯克很多 根据要求,以下是我使用的XML示例: XML1 最后,我得到的结果如下: <letterContent> <key1>key1</key1> <key2>key2</key2> <type>456</type> <obje

我尝试将XML文档中的一组节点插入到某个节点的另一个节点中。 我遵循提供的答案

但我不知道为什么,所有的属性值都会在导入中删除

有什么想法吗? 唐斯克很多

根据要求,以下是我使用的XML示例:

XML1

最后,我得到的结果如下:

<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>