代码之家  ›  专栏  ›  技术社区  ›  Craig Angus karan

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

  •  1
  • Craig Angus karan  · 技术社区  · 16 年前

    我有一个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 回复  |  直到 15 年前
        1
  •  2
  •   KV Prajapati    16 年前

    从Java文档中,

    使用 cloneNode 方法。

    总结:

    public Node cloneNode(boolean deep)
    

    返回此节点的副本, 即,作为通用副本 节点的构造函数。复制品 节点没有父节点;(ParentNode是 NULL。)

    克隆元素将复制所有 属性及其值,包括 那些由XML处理器生成的 表示默认属性,但 此方法不复制任何文本 包含,除非它是深度克隆, 因为文本包含在子级中 文本节点。克隆属性 直接克隆,而不是克隆为 元素克隆操作的一部分, 返回指定的属性( 指定为真)。克隆任何其他 节点类型只返回 这个节点。

    注意克隆不可变子树 结果是一个可变的拷贝,但是 实体引用克隆的子代 是只读的。此外,克隆 指定了未指定的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();
       }
       }
    
      }
    }
    
        2
  •  2
  •   Brian Agnew    16 年前

    DOM中的节点有其所属文档的概念(因此 WRONG_DOCUMENT_ERR )

    所以你需要 进口 从原始DOM到新DOM的节点。见 Document.importNode()