библиотека для проведения различий - PullRequest
2 голосов
/ 04 марта 2009

Мне было поручено создать инструмент, который сможет различать и объединять файлы конфигурации для продукта моей компании. Конфигурации хранятся в виде строк XML или URL. Я ищу библиотеку, желательно с открытым исходным кодом с лицензией, совместимой с коммерческим программным обеспечением, которая может делать эти различия. Наше приложение написано на C ++, поэтому библиотеки C ++ лучше всего подойдут, но я хочу взглянуть на библиотеки, специфичные для C #, так как я могу написать оболочку, которая предоставляет его C ++ через COM. Трехсторонние различия были бы идеальными, но двухсторонние приемлемы. Если у него есть понимание XML, это также будет плюсом (поскольку узлы XML могут быть переупорядочены без изменения документа и т. Д.). Любые предложения библиотеки? Должен ли я даже подумать над написанием своих собственных инструментов сравнения в надежде дать ему семантическое знание наших форматов?

Благодаря этому похожему вопросу , я уже обнаружил эту библиотеку Google , которая кажется действительно великолепной, но я все еще ищу другие варианты. Похоже, что он также может выводить различия в формате HTML (используя теги <ins> и <del>, которых я не знал, существовавших до того, как я их обнаружил), что может быть очень удобно, но, похоже, унифицировано только разница Мне нужно будет отобразить результаты в веб-браузере, и, вероятно, придется создать интерфейс для выполнения слияний в браузере. Я не ожидаю, что библиотека сможет помочь с этими задачами, но она должна выводить данные в формате, который мне подойдет, создавая его поверх этого. В настоящее время я представляю что-то похожее на TortoiseMerge (параллельные различия, не унифицированные), за исключением браузера. Любые советы / хитрости / дизайнерские идеи о том, как преподнести это, также будут оценены.

Ответы [ 3 ]

3 голосов
/ 04 марта 2009

Subversion поставляется с libsvn_diff и libsvn_delta по лицензии Apache Software License.

2 голосов
/ 06 марта 2009

Здесь - это библиотека C ++, которая может различать то, что автор называет полуструктурированными данными. Он прекрасно работает с HTML и XML. Поскольку ваши данные представляют собой XML, было бы разумно использовать это вместо простого текста diff. Это особенно актуально, когда файлы генерируются машиной.

В настоящее время я пытаюсь использовать эту библиотеку для создания инструмента, который использует файлы проекта Visual Studio. Это в основном файлы XML, и использование простого инструмента сравнения, такого как Winmerge, слишком болезненно, потому что Visual Studio в значительной степени портит весь файл путем сумасшедшего переупорядочения. Идея состоит в том, чтобы сделать какой-то структурированный diff для решения проблемы.

1 голос
/ 04 марта 2009

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

...