Как я могу клонировать весь Документ, используя Java DOM? - PullRequest
5 голосов
/ 11 ноября 2008

Я ищу надежный, независимый от реализации способ клонирования всего Документа. В Javadocs конкретно говорится, что вызов cloneNode в документе зависит от конкретной реализации. Я пытался передать документ через неактивный Transformer, но у получившегося узла нет владельца Document.

Я мог бы создать новый документ и импортировать узлы из старого, но я боюсь, что могут быть битые метаданные документа, которые могут быть потеряны. То же самое с записью документа в строку и его повторным анализом.

Есть идеи?

Кстати, я застрял на Java 1.4.2 по независящим от меня причинам.

Ответы [ 2 ]

7 голосов
/ 21 января 2010

Как отмечается в некоторых комментариях, существуют проблемы с сериализацией и повторным анализом документа. В дополнение к использованию памяти, соображениям производительности и нормализации, есть также потеря пролога (DTD или схема), потенциальная потеря комментариев (которые не требуются для захвата) и потеря того, что может быть значительным пробелом. Сериализации следует избегать.

Если реальная цель - сделать копию существующего объекта DOM Document, то он должен обрабатываться программно, в памяти. К счастью, есть относительно простой способ сделать это с помощью функций, доступных в 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();

Вот и все. Вам нужно будет обработать исключения и, возможно, захотите настроить преобразователь, но я оставлю это в качестве упражнения для читателя.

2 голосов
/ 11 ноября 2008

И все же, как насчет быстрого и грязного способа: сериализовать весь Документ в XML-строку и затем проанализировать его обратно с помощью DOM Parser?

Я не вижу причины, по которой в сериализованной версии ничего бы не хватало. Не могли бы привести пример?

Потребление памяти было бы значительным, но, с другой стороны, если вы дублируете весь DOM, оно все равно не может быть небольшим ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...