通過 XML Catalog 實現 XML 檔案的自動化即時校正

來源:互聯網
上載者:User

標籤:

 引言

XML Catalog 實現了根據 XSD 即時校正 XML 檔案的功能。使用者不用編寫程式,通過少量的配置就可以在編輯 XML 檔案的時候得到及時的反饋(需要在 XML 編輯器進行檔案的編寫),實現了即時的校正。

然而在實際應用中,由於環境的不同以及 XML 檔案本身的不同,手動方式的配置並不能滿足需求。比如,作者在實踐中發現,在開發環境裏手動配置的 XML Catalog 是不能儲存在運行環境的。而且,許多實際的 XML 的編寫方式並沒有採用標準的格式,這也給 XML Catalog 的使用帶來了很多的不便。

本文針對以上問題,通過例子來說明如何通過擴充 XML Catalog 來實現基於 xsd 對 XML 檔案的自動化即時校正。

XML Catalog 介紹

XML Catalog 是基於 OASIS XML Catalog specification 標準的實現,它提出了一些關於 XML 檔案如何引用外部資源的控制。Eclipse 的 WTP 提供了 XML Catalog 的功能,實現利用 schema 對 xml 檔案的即時校正功能。XML Catalog 是由來自一個或者多個 catalog 條目檔案的條目組成的 xml 檔案,其儲存了要校正的 xml 檔案以及該檔案對應的 xsd 檔案的映射,在運行時可以自動將它們關聯起來,從而實現對 xml 檔案的校正。

下面通過一個例子來說明 XML catalog 的相關概念。

XML Catalog 相關概念介紹
 <?xml version="1.0"?>  <!DOCTYPE catalog  PUBLIC "-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN" "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd"> 1  <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> 2  <group prefer="public" xml:base="file:///usr/share/xml/" > 3  <public  publicId="-//OASIS//DTD DocBook XML V4.5//EN" 4  uri="docbook45/docbookx.dtd"/>  <system  systemId="http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" 5  uri="docbook45/docbookx.dtd"/>  <system  systemId="docbook4.5.dtd" 6  uri="docbook45/docbookx.dtd"/>  </group>  </catalog>
  1. DOCTYPE 表示這個檔案是 OASIS XML catalog 檔案。如果沒有 網際網路連線,那麼,整個 DOCTYPE 的聲明需要刪除或者注釋掉。因為 catalog 處理器會嘗試從網路去下載 catalog.dtd 檔案,顯然在沒有網路的環境下,處理器因為找不到檔案會報錯。
  2. catalog 元素包含了 catalog 的內容和 catalog 的命名空間標識。
  3. group 元素是一個封裝元素,可以設定在這個組裡麵包含的所有 catalog 條目的屬性。屬性 prefer="public" 指出 catalog resolver(解析器) 在使用 SYSTEM 標識符之前優先使用 PUBLIC 標識符。屬性 xml:base 表明,所有 URI 都是相對這個路徑。本例中,uri="docbook45/docbookx.dtd"/ 是個相對路徑,絕對路徑應該是 file:///usr/share/xml/ docbook45/docbookx.dtd "。
  4. public 元素將 publicId 映射到 uri 的路徑。publicId 是資源的一個唯一標識,通常是該檔案的命名空間 .
  5. system 元素將 systemId 映射到 uri 的路徑。systemId 與 publicId 一樣,也是資源的唯一標識,通常是資源檔在檔案系統的全路徑。
XML Catalog 原理

XML Catalog 提供了一種重新置放資源的機制,可以將 xml 引用的 artifacts,包括 URI 地址以及 namespace 名重新置放到另一個地址。通常這種機制被用來將遠端引用資源重定位到本地或者 web。XML catalog 就是一個描述外部實體引用和本機快取的相同實體的映射的檔案。

在實際的開發生產中,xml 檔案經常會引用外部的檔案,這些檔案通常通過 URI 表示,其中以 URL 應用最廣。但是如果是絕對的 URL, 那麼只有當你的網路能夠訪問它時才能起作用,如果網路出現問題,那麼將不能訪問。當是相對 URL 時,例如"../../xml/dtd/docbookx.xml",只有當你的檔案系統和定義者一致的時候才能起作用。

一種解決辦法就是通過實體解析器(Entity Resolver)或者是 URI 解析器 (URI Resolver ),解析器可以通過檢查資源的 URI 來定位資源。 使用者通過配置 xml catalog, 手動的指定 xml 檔案引用的 xsd 檔案的本地地址,URI 解析器通過 xml catalog 裡面的映射,找到對應的 xsd, 最後 xml catalog 處理器通過解析器找到的 xsd 對 xml 進行校正。

通俗點說,XML catalog 通過命名空間將 xml 檔案及其對應的 xsd 檔案聯絡起來,並通過解析器定位 xsd 檔案的位置,最後通過處理器進行校正。

與 javax.xml.validation 通過 xsd 對 xml 進行校正的方法不同,xml catalog 可以通過 Namespace 來校正所有引用這個 xsd 的 xml 檔案,從而達到批量校正的效果。例如,a.xml,b.xml,c.xml 都是由 d.xsd 校正,那麼只要將 d.xsd 的命名空間配置好,通過該命名空間就可以校正以上三個檔案了。

手動方式配置 XML Catalog

手動設定 XML Catalog 比較簡單也比較容易理解,可以在 Eclipse 的開發環境中直接進行。選擇 File -> New -> Other -> Examples -> Editing and Validating XML files,便可以進行配置了。如所示:

圖 1. 開啟 XML Catalog 的配置介面

從圖 1 中可以看到有兩種 xml catalog entity , 使用者定義的實體及外掛程式的實體。用手動方式產生的配置屬於使用者配置的實體。

圖 2. 建立一個 XML Catalog Entry

建立一個 XML Catalog Entry 中的 Location 指明了 xsd 檔案的位置,在這裡我們選擇來源於工作空間。

圖 3. 從工作空間選擇 student.xsd 檔案

選擇 OK 以後,XML Catalog Entry 就建立完成了。XML Catalog 會自動填寫其他兩個屬性,如所示。

圖 4. 完整的 XML Catalog Entry

,Location 標籤指定了 xsd 的位置,在這裡是工作空間的相對路徑;Key Type 標籤表明了在這裡我們使用的是命名空間的名字作為 xml 和 xsd 的關聯;Key 標籤的值是 xml 命名空間的值。

圖 5. 完整的 XML Catalog Entry

從圖 5 中可以看出,建立的 XML Catalog Entry 已經在 User Specified Entries 目錄下。圖 1 到 4 顯示了 XML Catalog 的手動設定步驟。下面,我們在 XML 編輯器裡開啟一個 xml 檔案,看一下 XML Catalog 的功能。

圖 6. 正確的 XML 檔案

首先,用 XML 編輯器開啟 sample.xml 檔案。

圖 7. XML Catalog 的即時校正結果

將 name 為 BB 的學生的 age 標籤去調,可以看到在編輯器的右邊有一個紅色的點,同時在 student 元素下面有個紅色的波浪線,提示 student 元素有錯誤。這是,將滑鼠移到 student 元素上,可以看到具體的提示資訊,student 元素不完整,缺少 age 元素。

可以看出,應用 XML Catalog 對 xml 檔案進行即時校正,配置步驟比較簡單,只需提供相應的 xsd 檔案及位置,就能將他們關聯起來,實現自動的校正。

 

回頁首

擴充 XML Catalog Contributions

在實踐中發現,如果通過上一節介紹的手動方式在 Eclipse 開發環境配置 xml catalog,那麼這些配置並不會在運行環境生效。然而通常情況下,我們需要的是運行環境的配置。比如我們要開發一些小工具,可以讓使用者編輯 xml 檔案,同時我們內建了一些 xsd 檔案來校正使用者編輯的 xml 檔案是不是正確。因為不能讓使用者在使用產品的時候再重新設定(因為對使用者來說,他們並不需要知道這些 xsd 的存在,還有就是,不能增加使用者的負擔)。所以,我們需要在開發環境配置好 xsd 的資訊,並讓這些配置在運行時生效。通過調研,我們發現,如果要在運行環境中直接使用開發環境的配置,那麼需要擴充 xml catalog Contributions 這個擴充點。

下面我們就一步步的示範如何在 Eclipse 外掛程式裡擴充 XML Catalog Contributions 擴充點。

1.開啟 plugin.xml 檔案的 Extensions 標籤,點擊 Add 按鈕,添加擴充點。

圖 8. 添加擴充點

2.在 Extension Point filter 文字框裡輸入擴充點的名字,org.eclipse.wst.xml.core.catalogContributions,並選中該擴充點,點擊 OK 按鈕。

圖 9. 選中擴充點

圖 10 展示了成功添加擴充點後的 Extension 頁面。

圖 10. 成功添加擴充點

3.建立一個 catalogContribution

圖 11. 建立 catalogContribution

4.建立一個 public

圖 12. 建立 public

5.填寫 public 的屬性資訊。public 有兩個屬性,publicId 和 uri。

publicId 就是命名空間(namespace),uri 就是 xsd 檔案的物理位置,可以通過 Browse 按鈕來選擇 xsd 檔案。

圖 13. 填寫 public 詳細資料

通過以上 5 步,就完成了對 xml catalog Contributions 的擴充。圖 14 就是完成以上配置以後的 plug.xml 檔案內容。從這個檔案我們可以清楚地看清楚擴充的相應配置。

圖 14. plugin.xml 檔案

從圖 15 可以看出,與手工方式的配置不同,在運行時的環境裡,User Specified Entries 裡面並沒有內容。

圖 15. 運行環境的 XML Catalog 配置

將 sample.xml 改錯,可以看見 XML Catalog 的提示資訊。

圖 16. sampe.xml 檔案

通過以上的步驟,我們示範了,如何擴充 XML Catalog。在下一個部分,我們將會示範如何擴充 URI Resolver 實現特殊 XML 檔案的校正。

 擴充 URI Resolver

XML Catalog 雖然提供了比較強大的功能,但是由於實際生產環境的複雜性,一些 xml 檔案並不能由其進行校正。比如,有些 xml 檔案,由於書寫不規範,並沒有命名空間,還有些 xml 檔案,由於應用環境的原因,其使用了 xsi:schemaLocation 元素,將引用的 xsd 檔案直接定位到了虛擬路徑,導致 xml catalog 的定位功能失效 . 對於第一種情況,由於 XML Catalog 的設計理念就是通過命名空間進行 xml 和 xsd 的關聯,所以,不支援此種情況。對於第二中情況,我們可以通過擴充 XML Catalog 來實現。

在擴充 URI Resolver 之前,我們對 XML Catalog 可以處理的 xml 和 xsd 的類型進行了分類,以便大家能夠清楚地知道 XML Catalog 可以解決哪些問題。

xsd \ xml 有命名空間 無命名空間
有命名空間,無 xsi:schemaLocation 可以 不可以
有命名空間,有 xsi:schemaLocation,且其值是 xsd 實際存在的位置 可以 不可以
有命名空間,有 xsi:schemaLocation,且其值不是 xsd 實際存在的位置 可以 不可以
無命名空間  不可以 不可以
URI Resolver 簡介

URIResolver 負責資源的定位,XML Catalog 的處理器根據 URIResolver 的資源位置找到相應的 xsd,然後進行校正。

特殊的 XML 檔案

18 所示,sample.xml 檔案裡中有一個 xsi:shemaLocation 屬性,它將 xsd 的位置定位到 http://www.sample.com/sample/schemas/student.xsd。正常情況下,XML Catalog 會到該位置去找 xsd, 然而,在本文中這是一個無效的地址,所以 XML Catalog 會因為找不到 xsd 而不起作用。

圖 18. 帶有 schemaLocation 標籤的 XML 檔案擴充 org.eclipse.wst.common.uriresolver.resolverExtensions

resolverExtensions 擴充點可以讓使用者註冊自己的 URI Resolver,從而達到擴充預設 Resolver 的功能的作用。與預設的 Resolver 一樣,使用者擴充的 Resolver 也可以被編輯器,校正器和嚮導調用。

圖 17. 添加擴充點 resolverExtensions

如所示,該擴充點有三個屬性,class(類名), stage(階段)和 priority(優先順序)。Class 指定了實現 org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver 介面的類;stage 指定了在哪個階段運行 resolver(解析器),有三個值,分別是 prenormalization, postnormalization 和 physical,預設是 physical。Prenormalization 表示解析器在輸入參數的格式統一之前運行,postnormalization 表示解析器在輸入參數的格式統一之前運行,physical 表示在所有的 pre 和 postnormalization 解析器之後運行。Priority 指定了在處在相同 stage 的解析器的執行優先順序。優先順序分為 high(進階),medium(中級)和 low(低級)三種,預設為中級。

圖 18. 填寫擴充點的屬性

為增加了 resolverExtensions 擴充點的 plugin.xml 檔案的內容。

圖 19. plugin.xml 檔案內容實現 URIResolverExtension

1.首先,在外掛程式中建立一個類,實現 URIResolverExtension 介面。URIResolverExtension 介面提供了 resolve 方法,用來重新置放 xsd 資源,也就是找到有效 xsd。該方法的參數有四個,第一個類型為 IFile,是在工作空間 (workspace) 中的檔案,第二個參數是 String baseloaction,它是該檔案在檔案系統的絕對路徑,第三個參數是 publicId,它是該檔案的命名空間,最後一個參數是 String systemid,它是檔案的實際路徑,對於 xml 檔案來說,它的 systeid 為空白。但是因為我們在第 2 小節擴充了 XML Catalog, 所以,對於在 XML Catalog 檔案裡面配置好的 publicId,它的 systemId 就是該檔案裡面 Uri 的值,也就是 xsd 檔案的實際路徑。該函數的傳回值就是 xml 檔案引用的 xsd 檔案的位置。

清單 1. 實現 URIResolverExtension 介面
 public class MyURIResolverExtension implements URIResolverExtension {  public MyURIResolverExtension() {  }  @Override  public String resolve(IFile file, String baseLocation, String publicId,  String systemId) {  return null;  }  }
清單 2. 添加 catalog 到 catalog manager
ICatalog catalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();if (catalog == null) {return null; }
清單 3. 重新置放資源
 if (myResolved == null) {  if (publicId != null) {  if ((systemId != null && systemId.endsWith("student.xsd"))) //$NON-NLS-1$  {  try {  int index = systemId.lastIndexOf("/");  if (index > -1)   systemId = systemId.substring(index);  myResolved = catalog.resolvePublic(publicId, systemId);  } catch (MalformedURLException me) {  myResolved = null;  } catch (IOException ie) {  myResolved = null;  }  }  }  }

由清單 3 可以看出,我們通過 catalog manager 的 resolvePublic 方法,通過 publicId 找到 Catalog 裡與 publicId 對應 uri 的值,這個值就是 xsd 檔案的路徑。

 

小結

本文首先介紹了 XML Catalog 相關概念以及基本原理,使讀者對其有了初步的認識。接著通過一個簡單的例子介紹了手動方式配置 XML Catalog 的步驟,使讀者有了進一步的瞭解。最後,通過擴充 XML Catalog 和 URI Resolver 兩個擴充點來實現比較進階的功能,使讀者對該技術有了深入的瞭解。XML Catalog 是比較通用的解決 XML 即時校正問題的方法,尤其與 XML Catalog 和 URI Resolver 兩個擴充點的結合在解決一些特殊的 XML 檔案的即時校正問題時,往往能取得事半功倍的效果。

(轉)通過 XML Catalog 實現 XML 檔案的自動化即時校正

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.