繁体   English   中英

克隆dom.Document对象

[英]Cloning dom.Document object

我的目的是将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解决方案。 看看Transformer FactoryTransformer

您可以克隆树或仅克隆具有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时,您不会获得文档的完整副本。 标头未复制。

<?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"?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM