Программно Diff / Merge Xml документов - PullRequest
0 голосов
/ 23 октября 2009

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

У нас есть стороннее приложение, которое использует 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. Десериализовать документы базовой и пользовательской старых версий, чтобы получить список конкретных различий, применить эти различия к десериализованной версии новой базы и применить к ней различия, а затем выполнить повторную сериализацию в xml.

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

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

1 Ответ

2 голосов
/ 23 октября 2009

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

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

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

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

...