Учебник и примеры

Общий алгоритм сопоставления и схемы соответствия идентификаторов:
Создание схемы соответствия идентификаторов для улучшения результатов сравнения

Рассмотрим две версии файла XML (слева и справа), несколько отличающиеся друг от друга. Предположим, что элемент extension-point уникально идентифицируется атрибутом id. Различия в тексте выделены жирным шрифтом.

<?xml version="1.0" encoding="UTF-8"?>

<plugin
   name="%Plugin.name"
   id="org.eclipse.ui"
   version="1.0"
   provider-name="Object Technology International, Inc."
   class="org.eclipse.ui.internal.WorkbenchPlugin">

<extension-point name="%ExtPoint.editorMenus " id="editorActions"/>
<extension-point name="%ExtPoint.popupMenus " id="popupMenus"/>
<extension-point name="%ExtPoint.importWizards" id="importWizards"/>

</plugin>

  

<?xml version="1.0" encoding="UTF-8"?>

<plugin
   name="%Plugin.name"
   id="org.eclipse.ui"
   version="1.0"
   provider-name="Object Technology International, Inc."
   class="org.eclipse.ui.internal.WorkbenchPlugin">

<extension-point name="%ExtPoint.editorMenus " id="editorActions"/>
<extension-point name="%ExtPoint.popupMenus " id="popupMenus"/>
<extension-point name="%ExtPoint.exportWizards" id="exportWizards"/>

</plugin>


Предположим, что порядок элементов должен игнорироваться. Структурное различие между этими двумя документами заключается в том, что в документе, расположенном слева, содержится элемент extension-point с id="importWizards", а в документе, расположенном справа, этот элемент заменен новым элементом extension-point с id="exportWizards". Применение общего алгоритма сопоставления, называемого неупорядоченным (Unordered), поскольку он игнорирует порядок появления элементов XML в документе, позволяет получить следующее дерево изменений.

Дерево изменений, полученное с помощью общего алгоритма сопоставления

Первые два элемента extension-point идентичны, следовательно, они совпадают и не будут показаны в дереве изменений. Остается третий элемент extension-point. Поскольку в обоих документах имена третьих элементов одинаковы, то эти элементы совпадают. Затем в дереве изменений будут показаны различия между третьим элементом extension-point слева и третим элементом extension-point справа. Эти различия обусловлены значениями атрибутов id и name.
Это, однако, не то, что нам хотелось бы видеть. Мы бы хотели, чтобы в дереве изменений было показано, что слева был удален элемент extension-point, а справа добавлен новый элемент extension-point.
Для этого создадим новую схему соответствия идентификаторов, воспользовавшись соответствующей кнопкой панели инструментов.

Создание новой схемы соответствия идентификаторов

Предположим, что создана схема соответствия идентификаторов с именем MyPlugin. Теперь выберем схему MyPlugin из выпадающего списка панели инструментов

Выбор схемы MyPlugin

и добавим в нее следующее соответствие:

Создание нового соответствия на странице параметров     Создание нового соответствия с помощью контекстного меню

Это можно сделать на странице параметров (слева) или с помощью контекстного меню в панели Структура (справа).
Дерево изменений приобретает следующий вид:
(Для обновления панели Структура нажмите кнопку Кнопка для обновления панели выпадающего списка в панели инструментов.)

Дерево изменений, использующее схему соответствия идентификаторов MyPlugin

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

Модуль сравнения XML уже поставляется со схемой соответствия идентификаторов для файлов Plugin, которую можно настроить для отдельных файлов Plugin.

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

Кроме того, если используется схема соответствия ИД, но для некоторых элементов она не задана, то будет применяться метод неупорядоченного сравнения, то есть будет выполняться сравнение подобных элементов, независимо от порядка их появления в документе. Для того чтобы указать, что для потомков элемента должно выполняться упорядоченное сравнение, следует задать запись Ordered (см. следующий раздел).

Добавление записей Ordered

Записи Ordered позволяют указать, что для прямого потомка элемента xml (исключая атрибуты) необходимо выполнять упорядоченное (ordered) сравнение, а не неупорядоченное (unordered), выполняемое по умолчанию.
В качестве примера рассмотрим два варианта файла ANT, несколько отличающихся друг от друга:

<?xml version="1.0" encoding="UTF-8"?>

<project name="org.junit.wizards" default="export" basedir="..">
   <target name="export" depends="build">
      <mkdir dir="${destdir}" />
      <delete dir="${dest}" />
      <mkdir dir="${dest}" />
      <jar
         jarfile="${dest}/JUnitWizard.jar"
         basedir="bin"
      />
</project>

  

<?xml version="1.0" encoding="UTF-8"?>

<project name="org.junit.wizards" default="export" basedir="..">
   <target name="export" depends="build">
      <mkdir dir="${destdir}"/>
      <mkdir dir="${dest}"/>
      <delete dir="${dest}"/>
      <jar
         jarfile="${dest}/JUnitWizard.jar"
         basedir="bin"
      />
      <copy file="plugin.xml" todir="${dest}"/>
</project>


Различия в этих двух документах выделены жирным шрифтом. Два элемента (<mkdir dir="${dest}"/> и <delete dir="${dest}"/>) поменялись местами, а в элемент target был добавлен новый элемент (<copy .../>).
Результатом выполнения неупорядоченного сравнения будет следующее дерево изменений:

Дерево изменений, полученное с помощью неупорядоченного сравнения

Факт перемены мест двух элементов не отражен, так как порядок следования элементов игнорируется.
Однако, с точки зрения ANT, эти два документа работают совершенно по-разному, поскольку порядок элементов внутри target существенен. Следовательно, для элемента target необходимо создать запись ordered, чтобы заставить механизм сравнения выполнять упорядоченное сравнение прямых потомков элемента target.
Для этого прежде всего необходимо создать новую схему соответствия идентификаторов. Это можно сделать с помощью соответствующей кнопки панели инструментов.

Создание новой схемы соответствия идентификаторов

Предположим, что создана схема соответствия идентификаторов с именем MyANT.
Теперь выберем схему MyANT из выпадающего списка панели инструментов и добавим в нее следующую запись Ordered:

Создание новой записи ordered на странице параметров     Создание новой записи ordered с помощью контекстного меню

Это можно сделать на странице параметров (слева) или с помощью контекстного меню в панели Структура (справа).
Дерево изменений теперь выглядит следующим образом:
(Для обновления панели Структура нажмите кнопку Кнопка для обновления панели выпадающего списка в панели инструментов.)

Дерево изменений, использующее схему соответствия идентификаторов MyANT

Это именно тот результат, который был нужен, и он получен с помощью создания записи Ordered.

Схема соответствия идентификаторов может также применяться для уникальной идентификации упорядоченных потомков (см. предыдущий раздел). Ее применение позволяет улучшить результаты сравнения, особенно при многочисленных изменениях.

Модуль сравнения XML уже поставляется со схемой соответствия идентификаторов для файлов ANT, которую можно настроить для отдельных файлов ANT.