我有一个XML文件(左侧),我想创建多个文件(在右侧):
<ParentNode> file1:
<ChildNode> <ParentNode>
<node></node> <ChildNode>
</childNode> <node></node>
<ChildNode> </childNode>
<node></node> </ParentNode>
</childNode> file2:
<ChildNode> <ParentNode>
<node></node> <ChildNode>
</childNode> <node></node>
</ParentNode> </childNode>
</ParentNode>
我正在尝试从原始XML文件中获取第一个子节点并将其添加到新文件中,但我一直在更换节点时遇到错误。
我想做类似以下的事情
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document newDocument;
Node firstChild = document.getFirstChild();
NodeList childNodes = firstChild.getChildNodes();
Element parentNode;
for (int i = 1; i < childNodes.getLength(); i++ ) {
newDocument = docBuilder.newDocument();
parentNode = newDocument.createElement("ParentNode");
newDocument.appendChild(parentNode);
newDocument.getFirstChild().appendChild(childNodes.item(i));
}
但是我收到了错误
org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it.
指向正确方向的任何帮助表示赞赏!
答案 0 :(得分:2)
DOM中的节点具有其拥有文档的概念(因此您的WRONG_DOCUMENT_ERR
)。
因此,您需要将节点从原始DOM导入到新DOM中。见Document.importNode()
答案 1 :(得分:2)
来自Java文档,
使用cloneNode方法。
摘要:
public Node cloneNode(boolean deep)
返回此节点的副本, 即,作为通用副本 节点的构造函数。重复 节点没有父节点; (parentNode是 空值。)。
克隆元素全部复制 属性及其值,包括 那些由XML处理器生成的 表示默认属性,但是 此方法不会复制任何文本 包含除非是深层克隆, 因为文本包含在一个孩子中 文本节点。克隆属性 直接,而不是克隆为 Element克隆操作的一部分, 返回指定的属性( 指定是真的)。克隆任何其他 节点类型只返回一个副本 这个节点。
请注意克隆不可变子树 导致可变副本,但是 EntityReference克隆的子节点 只读。另外,克隆人 指定了未指定的Attr节点。 并且,克隆文档,DocumentType, 实体和表示法节点是 依赖于实现。
编辑:
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
public class Test{
static public void main(String[] arg) throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("foo.xml");
TransformerFactory tranFactory = TransformerFactory.newInstance();
Transformer aTransformer = tranFactory.newTransformer();
NodeList list = doc.getFirstChild().getChildNodes();
for (int i=0; i<list.getLength(); i++){
Node element = list.item(i).cloneNode(true);
if(element.hasChildNodes()){
Source src = new DOMSource(element);
FileOutputStream fs=new FileOutputStream("k" + i + ".xml");
Result dest = new StreamResult(fs);
aTransformer.transform(src, dest);
fs.close();
}
}
}
}