代码之家  ›  专栏  ›  技术社区  ›  Adam Crume

如何使用Java DOM克隆整个文档?

  •  5
  • Adam Crume  · 技术社区  · 16 年前

    我正在寻找一种可靠的、独立于实现的方法来克隆整个文档。Javadocs特别指出,在文档上调用cloneNode是特定于实现的。我已经尝试过通过一个no-op转换器传递文档,但是生成的节点没有所有者文档。

    有什么想法吗?

    2 回复  |  直到 16 年前
        1
  •  8
  •   Ichiro Furusato    15 年前

    正如一些注释所指出的,序列化和重新解析文档时存在问题。除了内存使用、性能考虑和规范化之外,还有prolog(DTD或schema)的丢失、注释的潜在丢失(不需要捕获)和可能是重要空白的丢失。应避免序列化。

    如果真正的目标是复制现有的DOM文档对象,那么应该在内存中以编程方式处理它。谢天谢地,有一种相对简单的方法可以使用Java5中提供的特性或使用外部的XSLT库(如Xalan)来实现这一点,这是一种传递转换。

    下面是Java 5解决方案:

    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();
    

    基本上就是这样。您需要处理异常并可能希望配置转换器,但我将此作为读者的练习。

        2
  •  2
  •   Vladimir Dyuzhev    16 年前

    我看不出序列化版本缺少任何内容的原因。介意举个例子吗?

    内存消耗是很重要的,但是,另一方面,如果复制整个DOM,它无论如何也不能很小。。。