Как сравнить файлы XML

Как сравнить файлы XML
На чтение
13 мин.
Просмотров
8
Дата обновления
11.11.2024

У меня есть два файла XML (XSD), которые генерируются каким-то инструментом.
Инструмент не сохраняет порядок элементов, поэтому, несмотря на то, что содержимое равно, сравнивая его, поскольку текст будет отображаться как файлы различны.
Есть ли какой-нибудь инструмент, который может сортировать элементы перед сравнением и позволять текстовое сравнение документов? Конечно, сортировка должна выполняться рекурсивно.

Пример данных:
Файл A:

    

Файл B:

      

У меня была аналогичная проблема, и я в конце концов обнаружил: http://superuser.com/questions/79920/how-can-i-diff-two-xml-files

В этом сообщении предлагается сделать канонический Сортировка XML, а затем сравнение. Следующее должно работать для вас, если вы используете Linux, Mac или Windows с установленным чем-то вроде Cygwin:

  $ xmllint --c14n FileA.xml> 1.  xml $ xmllint --c14n FileB.xml> 2.xml $ diff 1.xml 2.xml  

Взгляните на Использование XSLT для поддержки регрессионного тестирования, описывающего решение с использованием xslt


Как бы то ни было, я создал инструмент java (или на самом деле kotlin) для эффективной и настраиваемой канонизации файлов xml.

Он всегда будет:

  • Сортировать узлы и атрибуты по имени.
  • Удалите пространства имен (да — гипотетически это может быть проблемой).
  • Prettyprint результат.

Кроме того, вы можете указать это для:

  • Удалить данный список имен узлов — возможно, вы не хотите знать, что значение части метаданных — скажем, изменился.
  • Сортировка заданного списка коллекций в контексте родительского элемента — возможно, вам все равно, что порядок в изменился.

Он использует XSLT и выполняет все вышеперечисленное эффективно с использованием цепочки.

Он поддерживает сортировку вложенных списков — сортировку самых внутренних списков перед внешними. Но он не может надежно отсортировать произвольные уровни рекурсивно вложенных списков.

Если у вас есть такие потребности, вы можете — после использования этого инструмента — сравнить отсортированные байтовые массивы результатов. они будут равны, если останутся только проблемы с сортировкой списка.

Вы можете получить это здесь: XMLNormalize


Примеры XML принципиально отличаются. Даже если контент и иерархия могут быть идентичными, отношения между одноранговыми узлами различны. Когда XML анализируется, он разбирается в структуру, называемую DOM, где отношения между модулями очень важны.. Если вы хотите обесценить характер отношений между одноранговыми объектами, вам, вероятно, понадобится специальное программное обеспечение. Я рекомендую найти какой-нибудь простой инструмент сравнения с XML с открытым исходным кодом и добавить дополнительные требования, которые вам нужны. Я написал один на http://prettydiff.com/, но я предлагаю вам осмотреться, чтобы увидеть, что доступно, прежде чем принимать решение, потому что редактирование чужих алгоритмов может потребовать немного тяжелой работы.


Вы можете использовать Perl-модуль DifferenceMarkup http://metacpan.org/pod/XML::DifferenceMarkup или расширение xmldiff pecl.php.net/xmldiff в PHP. Оба будут создавать удобочитаемый XML-документ diff.



Какая программа может быть используется для сравнения файлов xml? [закрыто]

Я отчаянно ищу инструмент (Windows или Linux), с помощью которого я могу сравнить два XML-файла, не тратя полдня на настройку инструмент. В SO уже есть много ответов, но эти инструменты либо просто не работают (например, xmldiff, который всегда убивается), либо не работают должным образом (например, ExamDiff), либо могут работать, но требуют большой настройки (например, WinMerge) .

Я ищу чертовски простой инструмент для сравнения содержимого xml, разделения на разные атрибуты и т. д., если в файлах нет новой строки. Последние инструменты, упомянутые выше, сравнивают файлы и обнаруживают одно отличие: длина строки составляет много килобайт. Я не этого хочу.

Когда у меня есть два фильтра, начинающиеся со следующего:

       on  ...   ...  

Я хочу, чтобы были отмечены отдельные разные элементы, например

on 

или

     

и теперь вся строка, состоящая из 42246 символов.

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


Загрузка Notepad ++ здесь должна работать именно так, как вы просите.

Краткое руководство здесь об использовании инструмента сравнения/отличия.

edit: Извините, как сказал matan129, вам нужно перейти в Language -> XML.

4


Одно из решений — «разделить» файл вручную перед выполнением обычного diff (diff, kdiff, что угодно), применив

  sed -i 's/>/>  n/g' file.xml  

чтобы вручную вставить новые строки. Конечно, разделение можно улучшить, чтобы разделить на полные теги, но это решение — обходной путь, поскольку, похоже, не существует отдельных решений.

0 Комментариев
Комментариев на модерации: 0
Оставьте комментарий