克隆 dom.Document 对象

Posted

技术标签:

【中文标题】克隆 dom.Document 对象【英文标题】:Cloning dom.Document object 【发布时间】:2011-07-10 18:09:13 【问题描述】:

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

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

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

【问题讨论】:

可能是***.com/questions/279154/…的欺骗 【参考方案1】:
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 此方法将处理指令和cmets保留在副本中!【参考方案2】:

您可以在 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);

    

【讨论】:

注意,这种复制文档的方式会删除文件中的处理指令或cmets! 我相信这将删除附加到旧文档中任何节点的任何 UserData!这样做是有道理的,但必须意识到【参考方案3】:

您可以使用 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)
);

请注意,没有任何操作是线程安全的,因此要么仅在本地使用它们,要么使用线程本地或同步它们。

【讨论】:

【参考方案4】:

我会坚持使用 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"?>

【讨论】:

以上是关于克隆 dom.Document 对象的主要内容,如果未能解决你的问题,请参考以下文章

XML解析之DOM解析技术案例

DOM document 对象

DOM Document

Dom Document

HTML DOM Document对象 元素对象 属性对象 事件对象

浏览器端-W3School-JavaScript-HTML DOM:HTML DOM Document 对象