java - XPATH:将 xml 节点插入另一个 XML 文档
问题描述
我尝试将 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
</letterContent>
XML2
<expandedData attr4="value4">
<data attrd4="vd4">value d4</data>
<name nameattr="specific_name"/>
</expandedData>
预期结果:
<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="value4">
<data attrd4="vd4">value d4</data>
<name nameattr="specific_name"/>
</expandedData>
</expandedData
</letterContent>
如您所见,由于具有相似名称的嵌套元素,存在一些困难,但我可以通过这个...
这是我使用的Java:
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>
正如您在附加节点中看到的那样,所有属性值都被删除了......
解决方案
根据 Javadoc 的org.w3c.dom.Document#adoptNode(Node)
:
ELEMENT_NODE
采用源元素的指定属性节点。默认属性被丢弃,但如果被采用的文档定义了此元素名称的默认属性,则会分配这些属性。源元素的后代被递归采用。
默认情况下,属性会被丢弃——这就是为什么<expandedData>
添加没有属性的节点。使用Document#importNode(Node importedNode, boolean deep)
with 选项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>
推荐阅读
- time-complexity - 这个嵌套循环的时间复杂度是多少?
- c - 为什么我不能使用 int arr[2][2] 作为参数?
- python - 仅使用 Python 生成示例 SOAP 请求和响应模板。没有 Zeep、SOAPUI 或任何其他工具
- asp.net - 从 CSV 文件导入日期和时间的两列之间的差异
- npm - npm install 失败,在某些服务器上找不到某些包
- python - PySFTP/Paramiko 异常泄漏到标准错误中
- javascript - 平移 3D 点
- python-3.x - python - sqllite - 这是什么对象?0- 可下标
- javascript - 如何获取所有 Slide-Toggle 元素的 ID 和值
- flutter - 在颤动中处理复选框状态