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

我正在寻找一种可靠的,与实现无关的方法来克隆整个文档。 Javadocs特别指出,在Document上调用cloneNode是特定于实现的。 我尝试通过无操作的Transformer传递Document,但生成的Node没有所有者Document。

我可以创建一个新文档并从旧文档导入节点,但我担心可能会丢失一些文档元数据。 将Document写入字符串并将其解析回来也是如此。

有任何想法吗?

顺便说一句,由于我无法控制的原因,我陷入了Java 1.4.2。

正如一些评论指出的那样,序列化和重新解析文档存在问题。 除了内存使用,性能考虑和规范化之外,还会丢失prolog(DTD或模式),潜在的评论丢失(不需要捕获)以及丢失可能是重要的空白。 应该避免序列化。

如果真正的目标是制作现有DOM Document对象的副本,那么应该在内存中以编程方式处理它。 幸运的是,有一种相对简单的方法可以使用Java 5中提供的function或使用Xalan等外部XSLT库来实现此目的,这是一种传递转换。

下面显示了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(); 

基本上就是这样。 您需要处理exception并且可能希望配置变换器,但我将其留作读者练习。

还是,快速的方法怎么样:将整个Document序列化为XML字符串,然后使用DOM Parser将其解析回来?

我没有看到序列化版本缺少任何东西的原因。 介意提供一个例子?

内存消耗会很重要,但另一方面,如果你复制整个DOM,它无论如何都不能小……