65

В Linux, как я могу создать разницу между двумя файлами XML?

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

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

Например, следующее должно быть хорошо для меня:

<tag att1="one" att2="two">
  content
</tag>

<tag att2="two" att1="one">
  content
</tag>

8 ответов8

76

Один из подходов состоит в том, чтобы сначала превратить оба XML-файла в канонический XML и сравнить результаты, используя diff . Например, xmllint может использоваться для канонизации XML.

$ xmllint --c14n one.xml > 1.xml
$ xmllint --c14n two.xml > 2.xml
$ diff 1.xml 2.xml

Или как однострочник.

$ diff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
18

Ответ Юкки у меня не сработал, но он указывал на канонический XML. Ни --c14n, ни --c14n11 не отсортировали атрибуты, но я обнаружил, что ключ --exc-c14n действительно отсортировал атрибуты. --exc-c14n не указан на странице руководства, но описан в командной строке как "эксклюзивный канонический формат W3C".

$ xmllint --exc-c14n one.xml > 1.xml
$ xmllint --exc-c14n two.xml > 2.xml
$ diff 1.xml 2.xml

$ xmllint | grep c14
    --c14n : save in W3C canonical format v1.0 (with comments)
    --c14n11 : save in W3C canonical format v1.1 (with comments)
    --exc-c14n : save in W3C exclusive canonical format (with comments)

$ rpm -qf /usr/bin/xmllint
libxml2-2.7.6-14.el6.x86_64
libxml2-2.7.6-14.el6.i686

$ cat /etc/system-release
CentOS release 6.5 (Final)

Предупреждение --exc-c14n удаляет заголовок xml, тогда как --c14n добавляет заголовок xml, если его там нет.

15

Пытался использовать ответ @Jukka Matilainen, но у него были проблемы с пробелами (один из файлов был огромным в одну строку). Использование --format помогает пропустить различия между пробелами.

xmllint --format one.xml > 1.xml  
xmllint --format two.xml > 2.xml  
diff 1.xml 2.xml  

Примечание. Используйте команду vimdiff для параллельного сравнения xmls.

4

Если вы также хотите игнорировать порядок дочерних элементов, я написал для этого простой инструмент на python под названием xmldiffs:

Сравните два XML-файла, игнорируя элементы и порядок атрибутов.

Использование: xmldiffs [OPTION] FILE1 FILE2

Любые дополнительные параметры передаются команде diff .

Получить его на https://github.com/joh/xmldiffs

4

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

Изменить: Project Diffxml был перенесен на GitHub с 2013 года.

0

Я использую Beyond Compare для сравнения всех типов текстовых файлов. Они производят версии для Windows и Linux.

-1

Не уверен, считается ли (зависимость) онлайн-инструментом решением проблемы, но, несмотря на это, я получил хороший результат в этом онлайн-инструменте сравнения XML. Это просто работает.

-1

Наш SD Smart Differencer сравнивает документы на основе структуры, а не фактического макета.

Есть интеллектуальная разница XML. Для XML это означает соответствие порядка тегов и содержимого. Следует отметить, что текстовая строка в указанном вами фрагменте была другой. В настоящее время он не понимает понятие атрибутов тегов в XML, указывающее, является ли пробел нормализованным или значимым.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .