我的目的是將xml文件讀入Dom對象,編輯dom對象,這涉及到刪除一些節點。克隆dom.Document對象
完成此操作後,我希望將Dom恢復到原始狀態而不實際解析XML文件。
是否有無論如何我可以克隆我解析XML文件後獲得的dom對象的第一次。這個想法是爲了避免一直讀取和解析xml,只保留原始dom樹的副本。
我的目的是將xml文件讀入Dom對象,編輯dom對象,這涉及到刪除一些節點。克隆dom.Document對象
完成此操作後,我希望將Dom恢復到原始狀態而不實際解析XML文件。
是否有無論如何我可以克隆我解析XML文件後獲得的dom對象的第一次。這個想法是爲了避免一直讀取和解析xml,只保留原始dom樹的副本。
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 Factory和Transformer
isEqualNode()不返回可能的欺騙如果以這種方式複製,則爲true – ka3ak 2012-02-26 08:55:45
此方法會保留副本中的處理說明和註釋! – 2014-01-15 16:47:33
你可以在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);
}
}
請注意,這種複製文檔的方式將刪除文件中的處理指令或註釋! – 2014-01-15 16:46:34
我相信這會刪除任何附加到舊文檔中任何節點的UserData!這是有道理的,但必須注意 – ParkerHalo 2016-08-09 10:14:21
你可以克隆樹或僅具有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)
);
注意,沒有操作是線程安全的,所以要麼只能在本地使用它們,或者線程局部或同步它們。
我會堅持使用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"?>
的http://stackoverflow.com/questions/279154/how-can-i-clone-an-entire-document-using-the-java-dom – 2012-04-09 18:06:03