Вопрос

Как я могу сравнить содержимое двух (или более) больших файлов .resx?Учитывая сотни пар Имя / Значение в каждом файле, было бы очень полезно просмотреть объединенную версию.Меня особенно интересуют пары Имя / Значение, которые присутствуют в нейтральной культуре, но также не указаны в версии для конкретной культуры.

Это было полезно?

Решение

Существует отличный бесплатный инструмент для редактирования файлов resx, где вы можете просматривать несколько языков одновременно и четко видеть, чего не хватает или чего нет лишнего - Редактор ресурсов Zeta

Другие советы

Хотя это не инструмент для определения различий как таковой, Синхронизатор RESX может быть, это поможет вам здесь.Его основное применение заключается в обновлении локализованных файлов .resx новыми записями из файлов на нейтральном языке и удалении всех удаленных элементов.

Возможно, результат, сгенерированный при использовании его с помощью параметра командной строки / v, будет тем, что вам нужно.В остальном он поставляется с полным исходным кодом C #, так что, возможно, вы сможете адаптировать его под свои нужды.

Для более новых версий Visual Studio (2010+) теперь существует расширение Visual Studio под названием ResXManager ( Менеджер ресурсов) (создано томенглерт) что удивительно для этого.

Это позволяет вам последовательно просматривать каждый ресурс на каждом языке и выделять недостающие ресурсы.(Приведенный ниже пример взят со страницы загрузки расширения.)

Example From Extension Download Page

Использование простого diff для XML-файлов может быть совершенно бесполезным, если совпадающие элементы не отображаются в одинаковом порядке в обоих файлах.Я тоже искал специфичный для XML инструмент diff, но пока безуспешно.

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

  • Откройте .resx файлы в Visual Studio.
  • Выбрать все [Ctrl + A] и вырезать [Ctrl + X] (для больших файлов это может занять некоторое время - наберитесь терпения)
  • Паста [Ctrl + V] и сохранить (это позволит воссоздать .resx файлы, отсортированные по ключам)

Когда оба файла, таким образом, переупорядочиваются, обычное различение становится намного проще.Вы можете быстро найти недостающие ключи, просмотрев diff прямо сейчас.

Я перепробовал несколько инструментов XMl diff.Вот краткое изложение (требование, которое побудило меня оценить его, заключалось в том, чтобы отличать сгенерированный Visual Studio .resx файлы ресурсов, что, я думаю, является большой ошибкой Microsoft - порядок элементов случайный, и Windows Forms всегда перезаписывает ImageStream, если вы просто меняете местоположение кнопки и ничего не делаете со списком изображений).

  1. XmlDiff
  2. Араксис
  3. Альтова Диффундирующая собака
  4. XML-Блокнот
  5. ExamXML - экзамен
  6. Liquid XML Studio 2009 (существует меню XML diff, но использовать его может только лицензионная версия.Так что у меня нет возможности попробовать)

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

  1. XmlDiff - это первый инструмент, который я попробовал.Похоже, что он может делать то, что мне нужно, но после загрузки исходного кода (Visual Studio 2003) и скомпилирован с помощью Visual Studio 2005 (с успешным автоматическим обновлением) Я могу скомпилировать небольшой проект плавно.Но когда я сравниваю два реальных .resx файлы (1295 строк) разбились.Отладка в коде не дает мне представления о том, что произошло, потому что у меня нет исходного кода xmldiffpatch.dll XmlDiffPatch.View.dll.

    И причиной, по которой я не пытался подробнее разобраться в этом инструменте, был формат вывода или дизайн графического интерфейса.Он выводит HTML-файл с отличиями, выделенными в окне, размещенном в Internet Explorer.Для большого разнообразия XML-файлов это непросто использовать.

  2. XML Notepad имеет простой встроенный XML-diff.Согласно окну вывода, я думаю, что оно внутренне использует компонент XmlDiff.И выходные данные такие же, как XmlDiff.Я удалю его.

  3. Araxis - это гораздо более традиционный инструмент для анализа текста, он также может сравнивать двоичные файлы, файлы изображений, папки и файлы Word.Мне это очень нравится для любой другой задачи за исключением XML, потому что он не поддерживает параметры diff с поддержкой XML.

  4. Altova DiffDog выглядит как сложный коммерческий продукт, и он действительно содержал возможность игнорировать порядок элементов, что является ключевой особенностью для меня.

    Но после того, как попробовал это с тем же самым реальным .resx файл (1295 строк, по моему опыту, небольшой), я обнаружил, что "игнорировать порядок элементов" просто плохо работает, если два элемента расположены в очень разных местах в двух файлах.

  5. 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, на который указывает другой ответ в этой теме, автор ответил на приведенную выше статью code project и добавил эту функцию в ResXResourceManager, в ResxResourceManager вы можете настроить плагин для автоматической сортировки файла resx при (до) сохранении его на вкладке конфигурации.Есть даже вариант сортировки, который вы можете выбрать:Текущая культура, Порядковый номер или игнорируемый случай и т.д.

К сожалению, решение code-project и решение ResXResourceManager дают разный результат, исходный код доступен, я обнаружил, что решение code-project обрабатывает значение атрибута ">>" как обычный текст, поэтому семантически связанные виджеты разделены.Это можно легко исправить, добавив TrimStart('>') в LINQ.

Однако после исправления этого два инструмента по-прежнему дают разный результат.culprint - это LINQ по умолчанию, использующий CurrentCulture для сортировки строки, и я полностью игнорирую параметр сортировки revelant в resXResourceManager, для этой проблемы я думаю, что лучшим вариантом сортировки является "Порядковый номер".После добавления опции сортировки в решение code project и установки той же опции сортировки в ResXResourceManager, наконец, они выдают точно такой же результат!

Хотя resxResourceManager отлично подходит для централизованного управления ресурсом и устранения проблемы с порядком элементов resx, инструмент code-project по-прежнему бесценен для меня, поскольку он автономный, поэтому его можно использовать в более широких случаях;кроме того, код очень лаконичный и элегантный.

Я бы добавил еще одно замечание в конце моего обновления, я использую tortoise git, я использую Araxis для сравнения разных версий, сравнивать две версии файла resx практически бессмысленно, однако Araxis поддерживает пользовательский фильтр для преобразования входного файла до того, как механизм сравнения увидит его.Для сравнения, Araxis вызывает фильтр с помощью следующей команды:sortresx.exe -f C:\Users\ADMINI ~1\AppData\Local emp\mrg.8032.3.resx C:\Users\ADMINI ~1\AppData\Local emp\mrg.8032.2 C:\Users\ADMINI ~1\AppData\ Local emp\mrg.8032.4

-f означает foward, первое имя файла - это входной файл, второе имя файла - это выходной файл, в который должен быть записан фильтр, третье имя можно смело игнорировать.После внесения небольших изменений в код code-project теперь я могу скомпилировать программу фильтрации, настроить ее в Araxis и провести разумное сравнение версий resx даже для старых, испорченных файлов resx.

Вы могли бы что-то закодировать, используя XML Diff.Видишь Использование инструмента XML Diff и исправления ошибок в ваших приложениях.

Вы можете использовать такой инструмент, как diff от TortoiseSVN (если вы используете Windows).Просто выберите оба файла, щелкните правой кнопкой мыши и затем выберите "diff" в подменю TortoiseSVN.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top