Я пробовал несколько инструментов различий XMl. Вот краткое изложение (требование, которое заставило меня оценить его, заключалось в том, чтобы различать сгенерированные Visual Studio файлы ресурсов .resx
, что, на мой взгляд, является большой ошибкой, допущенной Microsoft - порядок элементов случайный, а Windows Forms всегда напишите ImageStream, если вы просто измените расположение кнопки и ничего не сделаете с imageList).
- XmlDiff
- Araxis
- Альтова DiffDog
- Блокнот XML
- ExamXML
- Liquid XML Studio 2009 (есть меню XML diff, но его может использовать только версия лицензии. Поэтому у меня нет шансов попробовать)
Прежде всего, не следует рассматривать все обычные инструменты сравнения, потому что они ничего не знают о XML, они рассматривают текстовые файлы как просто строки текста.
XmlDiff - это первый инструмент, который я попробовал. Похоже, что он действительно может понадобиться, но мне нужно, но после загрузки исходного кода ( Visual Studio 2003 ) и компиляции с Visual Studio 2005 (с успешным автоматическим обновлением) я могу без проблем скомпилировать небольшой проект. Но когда я сравнил два настоящих .resx
файла (1295 строк), он вылетел. Отладка в коде не дает мне понятия о том, что произошло, потому что у меня нет исходного кода xmldiffpatch.dll XmlDiffPatch.View.dll
.
И причина, по которой я не пытался больше копаться в этом инструменте, была в формате вывода или в дизайне GUI. Он выводит HTML-файл с различиями, выделенными в окне, размещенном в Internet Explorer. Для больших различий в XML-файле использовать его нелегко.
Блокнот XML имеет простую встроенную разность XML. В соответствии с окном вывода, я думаю, что оно внутренне использует компонент XmlDiff. И вывод такой же, как XmlDiff. Я удалю его.
Araxis является гораздо более традиционным инструментом для анализа текста, он также может сравнивать двоичный файл, файл изображения, папку и файлы слова. Мне это очень нравится для любой задачи сравнения , за исключением XML, потому что в ней нет поддержки параметров сравнения с поддержкой XML.
Altova DiffDog выглядит как сложный коммерческий продукт, и в нем есть опция игнорирования порядка элементов, что является для меня ключевой особенностью.
Но попробовав его с тем же реальным файлом .resx
(1295 строк, что не так уж и много в моем опыте), я обнаружил, что «порядок элементов игнорирования» просто не работает, если два элемента расположены в разные места в двух файлах.
ExamXML выглядит как коммерческий продукт, но это небольшой продукт. Но попробовав это, я обнаружил, что это самый идеальный инструмент на данный момент для моих ожиданий.
Есть и неутешительная сторона: она вылетела, когда я нажал F10 , чтобы перейти к следующему различию. Параметр игнорировать порядок элементов работает хорошо. Есть один недостаток, что настройка игнорируемого элемента не так гибка.
label1.Size
label1.Location
label1.Width
Я хочу игнорировать все различия в этих элементах, имя которых содержит «.Size» или «.Location» или «.Width», но невозможно определить такое условие одновременно. Настройка не поддерживает регулярные выражения.
В любом случае, я буду использовать ExamXML (с осторожностью) для сравнения файлов XML.
ОБНОВЛЕНИЕ 1:
Прошли годы, теперь я использую VS2017 и winform не изменилась с момента моего первоначального ответа на этот вопрос. Когда нужно разбить работу на разных людей, эта проблема всплывала снова и снова, мне скучно.
На самом деле я забыл этот ответ, Google привел меня сюда.
Я начал новый сеанс расследования и получил несколько хороших результатов:
https://www.codeproject.com/Articles/37022/Solving-the-resx-Merge-Problem
показывает, насколько легко мы можем отсортировать файл resx по атрибуту data / @ name по LINQ. Это удивительно Код ядра - это всего лишь один оператор, состоящий из нескольких LINQ.
Затем я также обнаружил, что ResXResourceManager, на который указывает другой ответ в этой теме, автор ответил на приведенную выше статью проекта кода и добавил функцию в ResXResourceManager, в ResxResourceManager вы можете настроить плагин для автоматической сортировки resx. файл, когда (до) вы сохраните его на вкладке конфигурации. Вы даже можете выбрать вариант сортировки: CurrentCulture, Ordinal или IgnoreCase и т. Д.
К сожалению, решение кода-проекта и решение ResXResourceManager дают разные результаты, источник доступен, я обнаружил, что решение кода-проекта относится к "& gt; & gt;" Значение атрибута как обычный текст, поэтому семантически связанные виджеты разделены. Это можно легко исправить, добавив TrimStart ('>') к LINQ.
Тем не менее, после исправления этого два инструмента по-прежнему дают разные результаты. По умолчанию используется LINQ, использующий CurrentCulture для сортировки строк, и я полностью игнорирую распространенную опцию сортировки в resXResourceManager, для этой проблемы, я думаю, лучшим вариантом сортировки является «Ordinal». После добавления опции сортировки в решение проекта кода и установки той же опции сортировки в ResXResourceManager, наконец, они дают точно такой же результат!
Хотя resxResourceManager отлично подходит для централизованного управления ресурсом и устранения проблемы с порядком элементов resx, инструмент кода проекта все еще неоценим для меня, поскольку он автономен, поэтому его можно использовать в более широких случаях; плюс, код очень лаконичный и элегантный.
Я бы добавил еще одну заметку в конце моего обновления, я использую Toritise Git, я использую Araxis для сравнения разных версий, почти бессмысленно сравнивать две ревизии файла resx, однако, поддержка Araxis для настройки фильтра для преобразования входной файл перед механизмом сравнения, увидевшим его. Для сравнения Araxis вызывает фильтр с помощью следующей команды:
sortresx.exe -f C: \ Users \ ADMINI ~ 1 \ AppData \ Local \ Temp \ mrg.8032.3.resx C: \ Users \ ADMINI ~ 1 \ AppData \ Local \ Temp \ mrg.8032.2 C: \ Users \ ADMINI ~ 1 \ AppData \ Local \ Temp \ mrg.8032.4
-f означает foward, первое имя файла является входным файлом, второе имя файла является выходным файлом, который должен быть записан фильтром, третий можно безопасно игнорировать. После внесения небольшого изменения в код проекта кода, теперь я могу скомпилировать программу-фильтр, сконфигурировать ее в Araxis и выполнить разумное сравнение рекс-версий даже на старых испорченных рекс-файлах.