Как я могу клонировать весь документ с помощью Java DOM?

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

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

Есть идеи?

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
0
9 814
2

Ответы 2

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

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

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

Это надуманный пример, но сериализация документа нормализует его. (Смежные текстовые узлы будут объединены.) Потребление памяти в этом конкретном случае не является проблемой.

Adam Crume 12.11.2008 21:30

На самом деле, гораздо лучшим примером был бы документ со встроенным DTD. Если вы используете бесполезный преобразователь для сериализации DOM, DTD не учитывается. Конечно, если есть лучший способ сериализации DOM, я все слышу.

Adam Crume 12.11.2008 22:07

Как отмечается в некоторых комментариях, существуют проблемы с сериализацией и повторным синтаксическим анализом документа. Помимо использования памяти, соображений производительности и нормализации, есть также потеря пролога (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, если я сравниваю оба документа.

ka3ak 26.02.2012 12:46

Другие вопросы по теме