克隆dom.Document对象

我的目的是将xml文件读入Dom对象,编辑dom对象,这涉及删除一些节点。

完成此操作后,我希望将Dom恢复到其原始状态,而不实际解析XML文件。

无论如何我可以克隆我第一次解析xml文件后获得的dom对象。 这个想法是为了避免一直读取和解析xml,只需保留原始dom树的副本。

您可以在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); } } 
 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解决方案。 看看变压器厂和变压器

您可以克隆树或仅克隆具有DOM cloneNode(boolean isDeepCopy)API的节点。

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

遗憾的是,由于Document上的cloneNode()是(根据API)实现特定的,我们必须采用防弹方式,即创建一个新的Document并从原始文档导入克隆节点:

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

请注意,所有操作都不是线程安全的,因此要么只在本地使用它们,要么使用Thread-Local或同步它们。

我会坚持使用TransformerFactory的第二个建议。 使用importNode,您无法获得该文档的完整副本。 标头不会被复制。

    

这不会返回上面的内容,因为这不会被复制。 它将使用您的新文档包含的内容。