Sunday, October 19, 2008

patch xml

Или описание способа наложения patches на xml.

  Использование обычных команд получения отличий для текстовых файлов неэффективно, так как они привязываются к разметке, а не структуре документа.

  Решение: использовать как patch xml полностью повторяющий структуру исходного файла с удалением частей которые не изменились.
Исходный файл:
<a>
  <b>
    <c>34</c>
  </b>
  <b>
    <c>45</c>
  </b>
</a>

Изменения:
<a>
  <b/>
  <b>
    <c>56</c>
  </b>
</a>
Результат:
<a>
  <b>
    <c>34</c>
  </b>
  <b>
    <c>56</c>
  </b>
</a>

  В этом примере так как первый узел с не изменился - он не присутствует в файле отличий. Родительский элемент от него присутствует для того чтобы указать, что изменился второй узел C.

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

Исходный файл:
<a>
  <b>
    <id>34</id>
    <c>34</c>
  </b>
  <b>
    <id>45</id>
    <c>45</c>
  </b>
</a>

Изменения:
<a>
  <b>
    <id>45</id>
    <c>56</c>
  </b>
</a>

Результат:
<a>
  <b>
    <id>34</id>
    <c>34</c>
  </b>
  <b>
    <id>45</id>
    <c>56</c>
  </b>
</a>
  Для удаляемых элементов завести служебный флаг удалено - чтобы по окончанию наложения получить уменьшение объема.
 Реализация обоих алгоритмом достаточно простая- создание из xml структуры в виде дерева
элементов содержащих:
  • имя элемента(узла),
  • номер по порядку в исходном xml(для второго случая должен заменяться на идентификатор - если он есть),
  • список подчиненных узлов,
  • значение элемента.


  С последующим наложением этих деревьев друг на друга или на исходный xml (не требуется потом преобразовывать в xml).

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

No comments: