Я ищу надежный, независимый от реализации способ клонирования всего документа. В Javadocs конкретно говорится, что вызов cloneNode в документе зависит от реализации. Я попытался передать документ через неработающий преобразователь, но полученный узел не имеет документа-владельца.
Я мог бы создать новый документ и импортировать узлы из старого, но боюсь, что могут быть потеряны фрагменты метаданных документа. То же самое с записью документа в строку и ее повторным синтаксическим анализом.
Есть идеи?
Кстати, я застрял на Java 1.4.2 по независящим от меня причинам.




Тем не менее, как насчет быстрого и грязного способа: сериализовать весь документ в строку XML, а затем проанализировать ее обратно с помощью DOM Parser?
Я не вижу причин, по которым в сериализованной версии чего-либо не хватало бы. Не могли бы привести пример?
Потребление памяти было бы значительным, но, с другой стороны, если вы дублируете всю DOM, она все равно не может быть маленькой ...
На самом деле, гораздо лучшим примером был бы документ со встроенным DTD. Если вы используете бесполезный преобразователь для сериализации DOM, DTD не учитывается. Конечно, если есть лучший способ сериализации DOM, я все слышу.
Как отмечается в некоторых комментариях, существуют проблемы с сериализацией и повторным синтаксическим анализом документа. Помимо использования памяти, соображений производительности и нормализации, есть также потеря пролога (DTD или схемы), потенциальная потеря комментариев (которые не требуется фиксировать) и потеря того, что может быть значительным пробелом. Следует избегать сериализации.
Если настоящая цель состоит в том, чтобы сделать копию существующего объекта документа DOM, тогда это следует обрабатывать программно в памяти. К счастью, есть относительно простой способ сделать это, используя функции, доступные в Java 5, или внешние библиотеки 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();
В основном это все. Вам нужно будет обработать исключения и, возможно, захотите настроить преобразователь, но я оставляю это в качестве упражнения для читателя.
Я пытался скопировать документ таким образом. Но isEqualNode () возвращает false, если я сравниваю оба документа.
Это надуманный пример, но сериализация документа нормализует его. (Смежные текстовые узлы будут объединены.) Потребление памяти в этом конкретном случае не является проблемой.