2011-03-08 262 views
9

我的目的是將xml文件讀入Dom對象,編輯dom對象,這涉及到刪除一些節點。克隆dom.Document對象

完成此操作後,我希望將Dom恢復到原始狀態而不實際解析XML文件。

是否有無論如何我可以克隆我解析XML文件後獲得的dom對象的第一次。這個想法是爲了避免一直讀取和解析xml,只保留原始dom樹的副本。

+0

的http://stackoverflow.com/questions/279154/how-can-i-clone-an-entire-document-using-the-java-dom – 2012-04-09 18:06:03

回答

5
TransformerFactory tfactory = TransformerFactory.newInstance(); 
Transformer tx = tfactory.newTransformer(); 
DOMSource source = new DOMSource(doc); 
DOMResult result = new DOMResult(); 
tx.transform(source,result); 
return (Document)result.getNode(); 

這將是使DOM文檔的副本Java 1.5的解決方案。看看Transformer FactoryTransformer

+0

isEqualNode()不返回可能的欺騙如果以這種方式複製,則爲true – ka3ak 2012-02-26 08:55:45

+0

此方法會保留副本中的處理說明和註釋! – 2014-01-15 16:47:33

11

你可以在org.w3c.dom.Document中使用importNode API:

Node copy = document.importNode(node, true); 

完整的例子

import java.io.File; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 

     Document originalDocument = db.parse(new File("input.xml")); 
     Node originalRoot = originalDocument.getDocumentElement(); 

     Document copiedDocument = db.newDocument(); 
     Node copiedRoot = copiedDocument.importNode(originalRoot, true); 
     copiedDocument.appendChild(copiedRoot); 

    } 
} 
+0

請注意,這種複製文檔的方式將刪除文件中的處理指令或註釋! – 2014-01-15 16:46:34

+0

我相信這會刪除任何附加到舊文檔中任何節點的UserData!這是有道理的,但必須注意 – ParkerHalo 2016-08-09 10:14:21

3

你可以克隆樹或僅具有DOM的節點cloneNode(boolean isDeepCopy)API。

Document originalDoc = parseDoc(); 
Document clonedDoc = originalDoc.cloneNode(true); 

不幸的是,因爲cloneNode()上的文件(根據API)實現特定的,我們必須去防彈方法,那就是,創建一個新的文件,並導入克隆節點從原始文檔:

... 
Document clonedDoc = documentFactory.newDocument(); 
cloneDoc.appendChild(
    cloneDoc.importNode(originalDoc.getDocumentElement(), true) 
); 

注意,沒有操作是線程安全的,所以要麼只能在本地使用它們,或者線程局部或同步它們。

0

我會堅持使用TransformerFactory的第二個建議。 使用importNode,您不會得到文檔的完整副本。 標題未被複制。

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<?aid style="50" type="snippet" readerVersion="6.0" featureSet="257" product="8.0(370)" ?>  
<?aid SnippetType="PageItem"?><Document DOMVersion="8.0" Self="d"> 

這將不會返回上面的,因爲這是不可複製的。這將會使用你的新文檔包含的內容。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>