XML Diff и Merge
Я думаю, что у меня есть довольно уникальная проблема для решения. Ну, я не могу найти достаточную информацию с помощью Google. Итак, вот оно,
Я работаю над Java EE SOA-приложением, которое хранит XML-документы в формате XML с использованием Oracle XML DB. Всякий раз, когда изменяется XML, я увеличиваю версию и бросаю предыдущую версию в другую таблицу.
Требование теперь состоит в том, что я должен хранить различия между двумя версиями как XML, а не весь XML-документ.
- Есть ли библиотека Java, которая может выполнять сравнение XML? (XMLUnit,...?)
- Существует ли стандартная XML-схема для хранения различий XML?
- Какую технологию преобразования можно использовать для применения "различий" к XML, чтобы идти туда и обратно между версиями? (XSLT, Groovy,....?)
Я ценю ваше время.
Ответы
Ответ 1
В моей последней работе у нас была аналогичная проблема: нам приходилось обнаруживать изменения, вставки и удаления определенных элементов между двумя файлами XML. Файлы не были произвольными XML; они должны были придерживаться нашего XSD.
Наше решение состояло в том, чтобы реализовать вид сортировки слияния: проанализируйте файлы (используя синтаксический анализатор SAX, а не DOM-парсер, чтобы разрешить произвольно большие файлы) и сохраните анализируемые данные в отдельных файлах HashMaps. Затем мы сравнили содержимое двух карт с использованием алгоритма сортировки типа слияния.
Естественно, чем больше получилось, тем больше мы ощущали давление памяти, поэтому я в конечном итоге написал класс FileHashMap, который помещал пространство значений HashMap в файлы случайного доступа. Хотя это теоретически медленнее, это решение позволило нашим сравнениям работать с очень большими файлами без обхода или OutOfMemoryError. (Версия этого класса FileHashMap доступна в этой библиотеке: http://www.clapper.org/software/java/util/)
Я не знаю, было ли то, что я только что описал, даже отдаленно близко к тому, что вам нужно, но я подумал, что поделюсь им на всякий случай.
Удачи.
Ответ 2
Замечание: теперь существует стандартный формат для "патчей", ориентированных на XML, в RFC 5261. Существует, по крайней мере, одна свободная программная программа xmlpatch, которая ее реализует. Он написан на языке C, вы можете называть его Java.
Ответ 3
Существует множество инструментов XML diff с открытым исходным кодом, написанных на Java, из которых вы можете вырезать. Один из таких инструментов - здесь.
Ответ 4
Попробуйте использовать Pretty Diff. Он предназначен для работы с несколькими различными расширениями при базовом XML-синтаксисе.
http://prettydiff.com/