Tutoriel et exemples

Correspondance générale et schémas de mappage des ID :
Comment créer un schéma de mappage des ID pour améliorer les résultats de la comparaison

Prenons l'exemple d'un fichier XML dans deux versions légèrement différentes ; celle de gauche et celle de droite. Supposons que l'élément extension-point est identifié de manière unique par l'attribut id. Les différences textuelles sont indiquées en gras.

<?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>


Supposons que l'ordre des éléments soit ignoré. La différence structurelle entre les deux documents se résume à l'élément extension-point avec id="importWizards" à gauche remplacé à droite par un nouveau extension-point avec id="exportWizards". En utilisant l'algorithme général de correspondance Unordered, car il ignore l'ordre suivant lequel les éléments XML apparaissent dans le document, nous obtenons l'arborescence des différences ci-après.

Arborescence des différences à l'aide d'un algorithme de correspondance général

Les deux premiers éléments extension-point sont identiques et sont donc mis en correspondance ; ils ne sont pas affichés dans l'arborescence des différences. Il reste le troisième élément extension-point des deux côtés, qui également mis en correspondance car il possède le même nom. L'arborescence des différences affiche alors les différences entre le troisième élément extension-point à gauche et le troisième élément extension-point à droite. Ces différences portent sur les valeurs des attributs id et name.
Ce n'est pas ce que nous recherchons. Nous aimerions que l'arborescence des différences nous indique qu'un élément extension-point a été supprimé à gauche et qu'un nouvel élément extension-point a été ajouté à droite.
Pour cela, nous devons créer un schéma de mappage des ID, à l'aide du bouton approprié de la barre d'outils.

Création d'un schéma de mappage des ID

Supposons que nous appelions le schéma de mappage des ID MyPlugin. Sélectionnons maintenant le schéma de mappage des ID MyPlugin dans la liste déroulante de la barre d'outils

Sélection du schéma de mappage des ID MyPlugin

et ajoutons-lui le mappage suivant :

Création d'un mappage à partir de la page des préférences     Création d'un mappage à l'aide du menu contextuel

L'entrée peut être créée à partir de la page des préférences (à gauche) ou du menu contextuel de la vue Structure (à droite).
L'arborescence des différences se présente maintenant comme suit :
(Pour régénérer la vue Structure, cliquez sur le bouton Bouton de mise à jour de la vue de la liste déroulante, dans la barre d'outils.)

Arborescence des différences à l'aide du schéma de mappage des ID MyPlugin

Résultat de comparaison souhaité obtenu en créant un schéma de mappage des ID.

Le plug-in Comparaison XML est déjà fourni avec un schéma de mappage des ID pour les fichiers de plug-in, qui peut être personnalisé pour des fichiers de plug-in spécifiques.

Avertissement :
Si un mappage des ID est créé, nous supposons que l'ID est unique (il n'existe pas deux éléments XML de même nom et chemin possédant le même ID). Si ce n'était pas le cas, le schéma de mappage des ID risquerait de ne pas afficher une arborescence des différences correcte.
Si un ID peut apparaître plusieurs fois, seul l'algorithme général doit être utilisé.

En outre, si un schéma de mappage est utilisé et qu'il existe des éléments sans mappage d'ID spécifié, la méthode de comparaison Unordered est utilisée (les éléments sont mis en correspondance en fonction de leur similarité et non en fonction de l'ordre suivant lequel ils apparaissent dans le document). Voir la section suivante relative aux entrées triées pour spécifier que les enfants d'un élément doivent être comparés en fonction de leur ordre d'apparition.

Ajout d'entrées triées

Les entrées triées permettent de spécifier que les enfants directs (hors attributs) d'un élément xml (identifié par son chemin) doivent être comparés triés, plutôt que non triés (par défaut).
Prenons l'exemple du fichier ANT suivant, dans deux versions légèrement différentes :

<?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>


Les différences entre les deux documents sont affichées en gras. Deux éléments ont été permutés (<mkdir dir="${dest}"/> et <delete dir="${dest}"/>) et un nouvel élément (<copy .../>) a été ajouté à l'élément cible.
Avec une comparaison non triée, nous obtenons l'arborescence des différences suivante :

Arborescence des différences à l'aide d'une arborescence non triée

Le fait que les deux éléments aient été permutés n'est pas indiqué car l'ordre des éléments est ignoré.
Toutefois, du point de vue d'ANT, les deux documents entraînent des comportements différents car l'ordre des éléments à l'intérieur d'une cible est important. Il faut donc créer une entrée triée pour la cible afin de spécifier au moteur de comparaison qu'il doit comparer les enfants directs de la cible une fois triés.
Pour cela, nous devons d'abord créer un schéma de mappage des ID, à l'aide du bouton approprié de la barre d'outils.

Création d'un schéma de mappage des ID

Supposons que nous appelions le schéma de mappage des ID MyANT.
Sélectionnons maintenant le schéma de mappage des ID MyANT dans la liste déroulante de la barre d'outils et ajoutons-le à l'entrée triée suivante :

Création d'une entrée triée à partir de la page des préférences     Création d'une entrée triée à l'aide du menu contextuel

L'entrée peut être créée à partir de la page des préférences (à gauche) ou du menu contextuel de la vue Structure (à droite).
L'arborescence des différences se présente maintenant comme suit :
(Pour régénérer la vue Structure, cliquez sur le bouton Bouton de mise à jour de la vue de la liste déroulante, dans la barre d'outils.)

Arborescence des différences à l'aide du schéma de mappage des ID MyANT

Résultat de comparaison souhaité obtenu en créant une entrée triée.

En outre, les mappages d'ID (voir section précédente) permettent d'identifier les enfants triés. En particulier, lorsque les modifications sont nombreuses, les résultats de comparaison sont améliorés.

Le plug-in Comparaison XML est déjà fourni avec un schéma de mappage des ID pour les fichiers ANT, qui peut être personnalisé pour des fichiers ANT spécifiques.