Lernprogramm und Beispiele

Allgemeiner Abgleich gegenüber ID-Zuordnungsschemen:
Wie kann ein ID-Zuordnungsschema erstellt werden, um die Vergleichsergebnisse zu verbessern?

Betrachten Sie eine Beispiels-XML-Datei in zwei leicht unterschiedlichen Versionen, links und rechts. Nehmen Sie an, dass das Element Erweiterungspunkt ausschließlich durch das Attribut ID definiert wird. Die Textunterschiede sind in fett dargestellt.

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


Nehmen Sie an, dass die Reihenfolge der Elemente zu ignorieren ist. Der Strukturunterschied zwischen den beiden Dokumenten besteht in dem Element Erweiterungspunkt auf der linken Seite, wobei id="importWizards" auf der rechten Seite mit einem neuen Erweiterungspunkt mit id="exportWizards" ersetzt wird. Mithilfe des allgemeine Abgleichalgorithmus mit dem Namen Unordered, da er die Reihenfolge, in die XML-Elemente in dem Dokument erscheinen, ignoriert, erhalten wir die folgende Unterschiedsstruktur.

Unterschiedsstruktur mit dem allgemeinen Abgleichalgorithmus

Die ersten beiden Erweiterungspunkt-Elemente sind identisch, sie sind also abgeglichen und werden in der Unterschiedsstruktur nicht angezeigt. Es bleibt ein drittes Erweiterungspunkt-Element auf beiden Seiten, das mit demselben Elementnamen ebenfalls abgeglichen ist. Die Unterschiedsstruktur zeigt die Unterschiede zwischen dem dritten Erweiterungspunkt-Element auf der linken Seite und dem dritten Erweiterungspunkt-Element auf der rechten Seite. Die Unterschiede bestehen in den Werten der Attribute ID und Name.
Dabei handelt es sich jedoch nicht um den Punkt, den wir betrachten möchten. Wir möchten, dass die Unterschiedsstruktur uns anzeigt, dass ein Erweiterungspunkt-Element auf der linken Seite entfernt wurde und ein neues Erweiterungspunkt-Element auf der rechten Seite hinzugefügt wurde.
Um dies zu erreichen, erstellen wir ein neues ID-Zuordnungsschema. Dazu verwenden wir die entsprechende Schaltfläche auf der Symbolleiste.

Ein neues ID-Zuordnungsschema erstellen

Gehen wir davon aus, dass wir das ID-Zuordnungsschema MyPlugin nennen. Jetzt wählen wir das ID-Zuordnungsschema MyPlugin aus der Drop-down-Liste der Symbolleiste aus.

Wählen Sie das ID-Zuordnungsschema MyPlugin aus

und fügen es der folgenden Zuordnung hinzu:

Eine neue Zuordnung auf der Benutzervorgabenseite erstellen     Eine neue Zuordnung mithilfe des Kontextmenüs erstellen

Dies kann auf der Benutzervorgabenseite (links) oder aus dem Kontextmenü in der Struktursicht (rechts) erfolgen.
Die Unterschiedsstruktur sieht nun wie folgt aus:
(Um die Struktursicht zu aktualisieren, klicken Sie auf die Schaltfläche Schaltfläche zur Aktualisierung der Sicht in der Drop-down-Liste der Symbolleiste.)

Unterschiedsstruktur mithilfe des ID-Zuordnungsschemas MyPlugin

An diesem Vergleichsergebnis waren wir interessiert und wir erreichten es durch die Erstellung eines ID-Zuordnungsschemas.

Das XML-Vergleichs-Plug-in enthält bereits ein ID-Zuordnungsschema für Plug-in-Dateien, das für bestimmte Plug-in-Dateien angepasst werden kann.

Warnung:
Wenn eine ID-Zuordnung erstellt wird, wird davon ausgegangen, dass eine ID eindeutig ist, d. h. dass keine zwei XML-Elemente mit demselben Namen und Pfad und derselben ID vorhanden sind. Sollte dies nicht der Fall sein, liefert das ID-Zuordnungsschema möglicherweise keine vernünftige Unterschiedsstruktur.
Wenn eine ID mehr als einmal erscheinen kann, sollte der allgemeine Algorithmus verwendet werden.

Wenn ein ID-Zuordnungsschema verwendet wird und keine Elemente vorhanden sind, für die keine ID-Zuordnung angegeben ist, wird die Unordered-Vergleichsmethode verwendet, d. h. die Elemente werden nach ihre Ähnlichkeit und nicht nach ihrer Reihenfolge im Dokument abgeglichen. Informationen, wie anzugeben ist, dass die untergeordneten Elemente eines Elements in der Reihenfolge ihrer Darstellung zu vergleichen sind, finden Sie im nächsten Abschnitt über sortierte Einträge.

Sortierte Einträge hinzufügen

Sortierte Einträge werden verwendet, um anzugeben, dass direkt dem XML-Element untergeordnete Elemente (ohne Attribute) - die durch ihren Pfad identifiziert werden - in einer sortierten Weise anstatt der standardmäßigen nicht sortierten Weise verglichen werden sollen.
Als Beispiel betrachten wir die folgende ANT-Datei in zwei leicht unterschiedlichen Versionen:

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


Die Unterschiede zwischen den beiden Dokumenten werden in fett dargestellt. Beide Elemente wurden ausgelagert (<mkdir dir="${dest}"/> und <delete dir="${dest}"/>) und ein neues Element (<copy .../>) wurde dem Zielelement angehängt.
Die Durchführung eines nicht sortierten Vergleichs ergibt die folgende Unterschiedsstruktur:

Unterschiedsstruktur bei nicht sortierter Zuordnung

Die Tatsache, dass zwei Elemente ausgelagert wurden, wird nicht angezeigt, da die Reihenfolge der Elemente ignoriert wird.
Aus der ANT-Perspektive verursachen die beiden Dokumente jedoch ein äußerst unterschiedliches Verhalten, da die Reihenfolge der Elemente innerhalb eines Ziels von Bedeutung ist. Daher möchten wir einen sortierten Eintrag für das Ziel erstellen, um die Vergleichsmaschine anzuweisen, die dem Ziel direkt untergeordneten Elemente in einer sortierten Weise zu vergleichen.
Dazu erstellen wir zunächst ein neues ID-Zuordnungsschema. Dies kann mithilfe der entsprechenden Schaltfläche auf der Symbolleiste erfolgen.

Ein neues ID-Zuordnungsschema erstellen

Gehen wir davon aus, dass wir das ID-Zuordnungsschema MyANT nennen.
Wir wählen jetzt das ID-Zuordnungsschema MyANT aus der Drop-down-Liste der Symbolleiste aus und fügen es dem folgenden sortierten Eintrag hinzu:

Einen neuen sortierten Eintrag auf der Benutzervorgabenseite erstellen     Einen neuen sortierten Eintrag mithilfe des Kontextmenüs erstellen

Dies kann auf der Benutzervorgabenseite (links) oder aus dem Kontextmenü in der Struktursicht (rechts) erfolgen.
Die Unterschiedsstruktur sieht nun wie folgt aus:
(Um die Struktursicht zu aktualisieren, klicken Sie auf die Schaltfläche Schaltfläche zur Aktualisierung der Sicht in der Drop-down-Liste der Symbolleiste.)

Unterschiedsstruktur mit dem ID-Zuordnungsschema MyANT

An diesem Vergleichsergebnis waren wir interessiert und wir erreichten es durch die Erstellung eines sortierten Eintrags.

Außerdem können ID-Zuordnungen (siehe Vorheriger Abschnitt) zur eindeutigen Identifizierung von sortierten untergeordneten Elementen verwendet werden. Besonders wenn zahlreiche Änderungen vorhanden sind, werden auf diese Weise die Vergleichsergebnisse verbessert.

Das XML-Vergleichs-Plug-in enthält bereits ein ID-Zuordnungsschema für ANT-Dateien, das für bestimmte ANT-Dateien angepasst werden kann.