Прямо сейчас мы пытаемся создать золотые конфигурации для нашей среды. Одно программное обеспечение, которое мы используем, опирается на большие XML
файлы, содержащие основную часть его конфигурации. Мы хотим взять нашу лабораторную среду, внести ее в каталог как нашу «золотую конфигурацию», а затем иметь возможность проводить аудит по этой конфигурации в будущем.
Поскольку diff - это побайтовое сравнение, а НЕ логическое сравнение, мы не можем использовать его для сравнения файлов в этом случае (XML
не упорядочен, поэтому работать не будет). Я ищу то, что может анализировать два XML
файлы и сравнивать их поэлементно. Пока что нам еще предстоит найти утилиты, которые могут это сделать. ОС не имеет значения, я могу делать это на чем угодно, где это будет работать. Предпочтение - что-то готовое.
Любые идеи?
Изменить: одна проблема, с которой мы столкнулись, заключается в том, что файлы конфигурации одного поставщика иногда упоминают один и тот же элемент несколько раз, каждый раз с разными атрибутами. Какую бы утилиту diff мы ни использовали, она должна иметь возможность идентифицировать либо набор атрибутов, либо идентифицировать их все как часть одного элемента. Непростая задача :)
Я использую два подхода: (а) канонизировать оба XML-файла и затем сравнивать их сериализации, и (б) использовать функцию XPath 2.0 deep-equal (). Оба подхода подходят для определения того, являются ли файлы одинаковыми, но не очень хорошо показывают, где они различаются.
Коммерческий инструмент, специализирующийся на решении этой проблемы, - это DeltaXML.
Если у вас есть вещи, которые вы считаете эквивалентными, но не эквивалентными на уровне XML - например, элементы в другом порядке, - тогда вам, возможно, придется подготовиться к выполнению преобразования для нормализации документов перед сравнением.
Хороший ответ здесь:
Вопрос: Как я могу различать два файла XML? | Суперпользователь
Ответ: Как я могу различать два файла XML? | Суперпользователь
$ xmllint --format --exc-c14n one.xml > 1.xml
$ xmllint --format --exc-c14n two.xml > 2.xml
$ diff 1.xml 2.xml
Приносим свои извинения за несоблюдение правил сбоя сервера ... Я уверен, что кто-нибудь сообщит мне об этом, и я внесу соответствующие изменения.
На основе Python xmldiff
выглядит очень привлекательным решением; он утверждает, что «извлекает различия между двумя XML-файлами и возвращает набор примитивов для применения к исходному дереву для получения конечного дерева».
Пример:
a1.xml
<root>
</root>
a2.xml
<root attr="test1">
</root>
xmldiff a1.xml a2.xml
:
[append-first, /,
<root attr="test1"/>
]
[remove, /root[2]]
Я написал для этого простой инструмент на Python под названием xmldiffs
:
Сравните два файла XML, игнорируя порядок элементов и атрибутов.
Использование:
xmldiffs [OPTION] FILE1 FILE2
Любые дополнительные параметры передаются в
diff
команда.
Получите это на https://github.com/joh/xmldiffs
Есть коммерческий и свободно инструменты, которые "осведомлены о XML" и сделают то, что вам нужно, без особых хлопот. Также очевидно плагин eclipse что будет сравнивать XML.
Кроме того, вы можете упорядочить поля с помощью xsl: sort или указав порядок следования в вашем XSD (что сделало бы любые существующие документы недействительными по определению). Затем «нормализуйте» оба документа перед сравнением с инструментом сравнения, не поддерживающим xml. Сначала нормализация устраняет любые различия в форматировании, которые не влияют на фактическое содержимое XML. (Думайте об этом как о применении фильтра стиля кода XML.)