Программное сравнение/объединение документов Xml

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

У нас есть стороннее приложение, которое использует Xml-документы для хранения всей своей бизнес-логики, поиска таблиц и т.п. Приложение имеет базовый набор Xml-файлов и использует своего рода модель наследования для предоставления унаследованных Xml-файлов, которые мы должны редактировать для настройки бизнес-логики. Я говорю «Вид из-за ужасной реализации наследования, которое он использует».

В настоящее время существует более 3000 отдельных файлов Xml размером от 1 до 5000 КБ и общим размером около 600 МБ. Единственное, что пока хорошо, это то, что все они используют один и тот же Xsd.

Наша проблема заключается в том, что мы получаем ежемесячные обновления основных файлов Xml, и мы должны установить их на место и обновить наши пользовательские документы, чтобы они соответствовали новой версии базовых документов. В настоящее время мы делаем это вручную, используя DiffDog, и собираем документы для создания новых, но я пытаюсь обдумать возможность сделать это программно. Позвольте мне посмотреть, могу ли я визуализировать это для вас:

Мы начинаем со структуры, подобной приведенной ниже, с базовым шаблоном и пользовательским шаблоном, в котором мы можем определить наши собственные правила (что мы часто делаем)

..\LineOfBusiness\BaseTemplates\BaseXml_1_0_0_0.xml
..\LineOfBusiness\CustomTemplates\Document_1_0_0_0.xml

Затем каждый месяц мы получаем обновление, поэтому теперь у нас есть такая структура:

..\LineOfBusiness\BaseTemplates\BaseXml_1_0_0_0.xml
..\LineOfBusiness\BaseTemplates\BaseXml_1_1_0_0.xml
..\LineOfBusiness\CustomTemplates\Document_1_0_0_0.xml

Наша задача, по сути, состоит в том, чтобы создать

..\LineOfBusiness\CustomTemplates\Document_1_1_0_0.xml

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

Я знаю, что эта система смехотворна, но я не могу изменить ее сегодня. Любые идеи о том, как решить эту проблему, были бы замечательными. Я могу сказать вам, о чем я думал до сих пор ...

  1. Десериализуйте документы старой версии Base и Custom, чтобы получить список конкретных различий, примените эти различия к десериализованной версии новой версии Base и примените к ней различия, а затем выполните повторную сериализацию в xml.

  2. Примените какой-либо процесс аннотации к пользовательским шаблонам, чтобы мы могли программно извлекать различия во время обновления.

  3. Отдайте процесс обновления на аутсорсинг...


person Jeff Sheldon    schedule 23.10.2009    source источник
comment
В первую очередь мы являемся магазином Microsoft, хотя у нас есть два разработчика Java. Но помимо языка, любая идея или мысли будут оценены.   -  person Jeff Sheldon    schedule 23.10.2009


Ответы (1)


Если вы используете язык .NET, вы можете выполнить то, что пытаетесь сделать, с помощью Инструмент/библиотека Microsoft XML Diff and Patch.

Я использовал его, чтобы правильно определить, что между разными фрагментами xml были изменения. Это было важно для нашего сценария, поскольку XML, который у нас был на диске, будет отличаться после сохранения в столбце XML сервера Sql из-за удаления незначительных пробелов и/или переупорядочения атрибутов (Infoset). Простое сравнение текстовых блоков всегда будет обнаруживать разницу, хотя на самом деле элементы/значения XML были одинаковыми.

Я не использовал возможность исправления этого инструмента, только XmlDiff.

На рынке есть несколько хороших коммерческих инструментов сравнения XML, но я не знаю ни одного, который предоставляет код или скрипты API. Это было бы хорошей функцией для добавления ценности!

person Zach Bonham    schedule 23.10.2009
comment
Я просмотрел другие инструменты Diff/Patch, мне нужно взглянуть на этот. Я думал об этой базовой концепции. Возьмите два документа 5_0 и сгенерируйте из них патч. Затем возьмите этот патч и примените его к документу 5_1, чтобы создать пользовательский документ 5_1. - person Jeff Sheldon; 23.10.2009
comment
если вы получаете что-то работающее по вашему вкусу, напишите об этом. Я хотел бы услышать ваш опыт с ним. Удачи! - person Zach Bonham; 24.10.2009
comment
Xml Diff отлично подходит для сравнения, единственная проблема заключается в том, что DiffGram, который я могу сгенерировать, хранит хеш-значение для исходного документа. Поэтому я не могу применить патч к новому документу. Кроме того, он создает патч на основе индекса узлов, поэтому я также не мог вручную применить его к новому документу. Этот инструмент определенно пригодится в будущем, но я не думаю, что он поможет в этой ситуации. - person Jeff Sheldon; 26.10.2009
comment
Независимо от того, что это помогает в моих конкретных обстоятельствах, я думаю, что это лучший ответ на вопрос, поэтому я пошел дальше и отметил его как ответ. - person Jeff Sheldon; 05.01.2010