指導教學和範例

一般比對與 ID 對映架構:
如何建立 ID 對映架構,來改善比較結果

請看看下面左右這兩個版本不太一樣的 XML 檔範例。 假設元素 extension-point 是由屬性 id 專門指定。 文字差異是以粗體顯示。

<?xml version="1.0" encoding="big5"?>

<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="big5"?>

<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", 後者已經換成具有 id="exportWizards"extension-point 了。 下面這個差異樹狀結構,是採用一般比對演算法(稱為未排序)所得出,因為它完全不考慮 XML 元素在文件的出現順序。

使用一般比對演算法的差異樹狀結構

前兩個 extension-point 元素完全一樣,彼此相符,因此不會出現在差異樹狀結構上。 不過兩邊的第三個 extension-point 元素則保留下來,其元素名稱一樣,彼此相符。 差異樹狀結構會顯示差異在左邊的第三個 extension-point 元素,以及右邊的第三個 extension-point 元素。 這兩個差異為屬性 idname 的值所組成。
不過,我們不是要看這個。 我們希望差異樹狀結構顯示的是,extension-point 元素已經從左手邊移除了,而右邊則新增 extension-point 元素。
我們可以建立新的 ID 對映架構,而達到這個目的。 我們可以利用工具列上的適當按鈕來執行這個動作。

建立新的 ID 對映架構

假設我們呼叫 ID 對映架構 MyPlugin。 我們從工具列的下拉清單中,選擇 ID 對映架構 MyPlugin。

選取 MyPlugin ID 對映架構

然後把它加到下面這個對映表中:

從喜好設定頁面建立新的對映表     使用快速功能表來建立新的對映表

您可以從喜好設定頁面(左手邊)或是從結構視圖的快速功能表(右手邊),來執行這個動作。
現在差異樹狀結構應該如下所示:
(如果要重新整理結構視圖,請按一下工具列下拉清單的更新視圖按鈕)。

使用 MyPlugin ID 對映架構的差異樹狀結構

這是我們所要的,以及我們以建立的 ID 對映架構得出的比較結果。

XML 比較外掛程式已經附有一個外掛程式檔所用的 ID 對映架構,它可以針對特定的外掛程式檔案加以自訂。

警告:
如果您建立了一個 ID 對映,它會假設這個 ID 是專屬的 ID,換句話說,不會有兩個同名同路徑的 XML 元素有相同的 ID。 如果不是這樣,ID 對映架構可能不會傳遞可感應的差異樹狀結構。
只要 ID 出現一次以上,您就得採用一般演算法。

同時,當您使用 ID 對映架構, 而且元素沒有指定任何 ID 對映時, 則使用未排序的比較方法,也就是說,元素是以相似度(而不是以它們出現在文件的順序)來比對的。 如果要指定元素子項是否應該以出現的順序來進行比較,請參閱下一節中,有關排好順序的項目的資訊。

新增排好順序的項目

您可以使用排好順序的項目,來指定 xml 元素的直屬子項(但不包括屬性)- 根據其路徑加以識別 - 是否應該以排好順序的方法(而不是預設的不排順序的方法)來進行比較。
讓我們看看下面這個例子,兩個不太相同的版本中的 ANT 檔:

<?xml version="1.0" encoding="big5"?>

<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="big5"?>

<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}"/>)互相對調, 目標元素後面則附加了新的元素 (<copy .../>)。
如果是執行未排序的比較方法,會產生下面這個差異樹狀結構:

使用未排序比對方法的差異樹狀結構

這一次並沒有顯示兩個元素對調的情形,因為它不管元素的順序。
不過,從 ANT 的觀點來看,這兩份文件會產生相當不同的行為,因為 target 中的元素順序很重要。 因此我們要為目標建立一個排好順序的項目,告訴比較引擎,以排好順序的方式來比較目標的直屬子項。
第一步是建立新的 ID 對映架構。 您可以利用工具列上適當的按鈕來執行這個動作。

建立新的 ID 對映架構

假設我們呼叫 ID 對映架構 MyANT
我們從工具列的下拉清單中,選擇 ID 對映架構 MyANT,然後把它新增到下面這個排好順序的項目中:

從喜好設定頁面建立排好順序的新項目     利用快速功能表建立排好順序的新項目

您可以從喜好設定頁面(左手邊)或是從結構視圖的快速功能表(右手邊),來執行這個動作。
現在差異樹狀結構應該如下所示:
(如果要重新整理結構視圖,請按一下工具列下拉清單的更新視圖按鈕)。

使用 MyANT ID 對映架構的差異樹狀結構

這就是我們所要的,以及我們以建立排好順序的項目而得出的比較結果。

此外,您可以利用 ID 對映(請參閱前一節),專門識別排好順序的子項。 尤其如果變動的部分很多時,這個方法的確可以改善比較結果。

XML 比較外掛程式已經附有一個 ANT 檔所用的 ID 對映架構,它可以針對特定的 ANT 檔加以自訂。