сохранение и восстановление различий в xml - PullRequest
1 голос
/ 13 января 2010

Я использую asp.net и .net framework 2.0. Возможно, я смогу обновить серверы до 3.5, если решение достаточно убедительно. Вот проблема.

У меня есть два куска XML. Я буду ссылаться на часть № 1 как шаблон , а часть № 2 - как фактическую .

Вот базовый пример:

шаблон

<questions>
 <question1 msg="1234">
   <answer></answer>
 </question1>
 <question2 msg="1235">
   <answer></answer>
 </question2>
 <question3 msg="">
   <answer></answer>
 </question3>
</questions>

фактический

<questions>
 <question1 msg="1234">
   <answer>foo</answer>
 </question1>
 <question2 msg="1235">
   <answer>bar</answer>
 </question2>
 <question3 msg="dynamic">
   <answer>blob</answer>
 </question3>
</questions>

Шаблон является общим и общим для многих пользователей, тогда есть фактическая , которая характерна для отдельных пользователей.

Я бы хотел извлечь дельту между фактическим и шаблоном таким образом, чтобы его можно было сохранить независимо, а затем повторно применить к шаблону , чтобы получить полное представление о фактических xml.

Я кое-что посмотрел и нашел инструмент «XML Diff and Patch» для .net 1.0, который выглядит так, как будто он делает в точности то, что мне нужно, но потом я нашел некоторые другие ссылки на него, которые, кажется, указывают упал с радара. http://msdn.microsoft.com/en-us/library/aa302294.aspx

Я также нашел несколько примеров, которые основаны на конкретной структуре xml для ручного извлечения различий между сущностями, представленными в xml. Мне вообще неудобно с этим решением, и я действительно предпочел бы более общее решение, которое устойчиво к изменениям, внесенным в xml.

В идеале я бы хотел найти где-нибудь функциональность xmldiff / patch, встроенную в .net2.0 / 3.5. Если нет, то что-то, что решает вышеуказанную проблему достаточно обобщенно, чтобы не сломаться при изменении xml.

Спасибо

Ответы [ 2 ]

1 голос
/ 13 января 2010

Я думаю, что вы, возможно, чрезмерно проектируете это. Хотя инструмент diff / patch может удовлетворить ваши потребности, мне кажется, что что-то менее общее также удовлетворит ваши потребности.

В вашем примере тег <answer/> всегда присутствует в шаблоне и всегда пуст без атрибутов. Все дочерние элементы тега <questions/> имеют имена, начинающиеся с «вопрос», и все они имеют атрибут msg, значение которого является целым или пустым. Если это целое число, то его значение соответствует соответствующему значению из «фактического» файла, но если оно пустое, оно может соответствовать «динамическому».

Учитывая эти ограничения, множество возможных различий описать гораздо проще: это просто содержание элемента <answer/> в каждом вопросе. Об этом гораздо проще подумать, чем обойтись утилита diff общего назначения.

0 голосов
/ 11 февраля 2010

Я получил пакет xmlDiffPatch от Microsoft по следующему адресу: http://download.microsoft.com/download/xml/Patch/1.0/WXP/EN-US/xmldiffpatch.exe

Это прекрасно работает в моем решении .net 2.0. Используя эту технику, я смог сократить объем хранимых данных до 2-25% от объема данных, которые нам ранее требовалось хранить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...