克隆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,您无法获得该文档的完整副本。 标头不会被复制。
这不会返回上面的内容,因为这不会被复制。 它将使用您的新文档包含的内容。