将XML节点中的子节点拆分为自己的XML文件

时间:2009-09-03 11:05:40

标签: java xml dom parsing

我有一个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.

指向正确方向的任何帮助表示赞赏!

2 个答案:

答案 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();
   }
   }

  }
}