天天看點

用Eclipse進行XML開發

用 Eclipse 進行 XML 開發

作者:Pawel Leszek     來自:IBM

  本文概述了 Eclipse 平台如何支援 XML(可擴充标記語言,Extensible Markup Language)開發。Eclipse 并不直接支援 XML 代碼編輯。然而,因為 Eclipse 是一個用于建構開發人員工具的與平台無關的架構,是以可以相對容易地添加對新語言的支援。

  已經開發出了許多 XML 插件,新的插件也不斷得以建立。本文主要讨論名為 XMLBuddy 的插件,因為它豐富的功能集合包含 XML 文檔開發所需的大多數功能。我們也會提到其它插件,這些插件能為特定任務提供更豐富的使用者選項集。本文将使您熟悉基本的 XML 編輯功能,但要記住:Eclipse 是一個可以讓無數工具和功能為您所用的動态架構集。

  Eclipse XML 編輯器

  Eclipse 已經包括一個非常簡單的 XML 編輯器的源代碼,這個編輯器隻提供 XML 文法的突出顯示。它繼承 org.eclipse.ui.editors 包中包括的類,這個包為 Eclipse 平台提供一個标準文本編輯器和基于檔案的文檔提供程式。這個簡單的 XML 編輯器起着代碼示例的作用,您可以把它作為自己的 Eclipse XML 插件的基礎。它的源代碼隻能通過 Eclipse 項目向導生成,您需要按下面所描述的自己編譯它。

  要建構這個基本 XML 編輯器,轉至菜單 File => New,然後選擇 Project。在項目向導中,選擇 Plug-in Development => Plug-in Project。

  如果看不到 Plug-in Development 選項,則表示 Eclipse 平台 Runtime Binary 沒有 Plug-in 開發環境。請到 eclipse.org 下載下傳頁面下載下傳 Eclipse 平台 Plug-in SDK。

  單擊 Next。給項目命名(如 org.my.eclipse.xmleditor),單擊 Next,然後接受螢幕 Plug-in Project Structure 上的預設值。接下來選擇 Create a plug-in project using a code generation 向導,然後選擇 Plug-in with an editor 選項。向導會自動生成該 XML 編輯器的源代碼。

  但仍需編譯它。單擊 Next,然後在下一螢幕 Simple Plug-in Content 上單擊 Finish 選項;轉至 Project 菜單并選擇 Rebuild All 來建構該項目。

  接下來需要使用 File => Export 菜單建立 editor.jar 檔案。請退出 Eclipse,然後複制整個 org.my.eclipse.xmleditor plugin 目錄。當您再次運作 Eclipse 時,可将一個 XML 檔案添加到您的項目中,了解 XML 文法突出顯示是如何工作的(請參閱圖 1)。請記住這個樣本 XML 編輯器未提供任何一種驗證或文法檢查。

用Eclipse進行XML開發

圖 1. 由 Eclipse XML 編輯器提供的簡單的文法突出顯示

  用 XMLBuddy 編寫 XML

  最受歡迎且最進階的 Eclipse XML 編輯器插件是由 Bocaloco Software 開發的 XMLBuddy。XMLBuddy 是免費插件,它為 Eclipse 增添了 XML 編輯能力,其中包括對使用者可配置的文法着色、DTD 驅動的代碼輔助、驗證以及同步的提綱視圖。XML Buddy 還為 Workspace 添加 XML 透視圖,為 XML 文檔和 DTD 添加新的項目模闆。您可以象安裝任何其它 Eclipse 插件那樣安裝 XMLBuddy:隻需将插件壓縮檔案解壓縮至主 Eclipse 安裝目錄下的 /eclipse/plugins 子目錄即可。記住要重新啟動 Eclipse。圖 2 顯示操作中的 XMLBuddy。

用Eclipse進行XML開發

圖 2. 操作中的 XMLBuddy:帶 XML Outline 視圖的主編輯器視窗

  XML 是元标記語言。XML 元素由起始标記、結束标記和二者之間的資料組成,是以有了文法突出顯示還需要好的編輯功能。XMLBuddy(目前是版本 0.2)用以下 XML 編輯功能擴充 Eclipse:

  ● 格式化。可以通過選擇全部或部分代碼對整個 XML 文檔或部分文檔自動進行格式化。

  ● 進階文法着色。可通過 Window => Preferences => XML => Colors 菜單配置 XML 代碼着色。着色可用于普通 XML 文檔、DTD(内部或外部子集)和 JSP 檔案。圖 3 示範如何更改文法突出顯示的預設設定。

用Eclipse進行XML開發

圖 3. 更改 XML 文法突出顯示的預設設定

  ● XML 代碼輔助。根據文檔的 DTD,可為元素或其它标記名稱、屬性名稱及屬性值提供輔助。

  ● 擴充字元編碼支援。XMLBuddy 根據 XML 1.0 規範自動檢測文檔編碼,它接受 <?xml 編碼聲明(如果提供了的話)。也可以為所有的 XML 文檔或隻為特定的某個檔案指定預設編碼。

  ● 提綱(Outline)視圖。提綱視圖視窗顯示文檔中元素的結構。預設情況下,提綱與編輯動态同步。這能使您快速浏覽文檔的邏輯。

  ● DTD 生成。可以動态地從文檔的内容生成 DTD。XMLBuddy 在本地高速緩存基于網際網路的 DTD,是以不管要使用 DTD 和相關的文檔多少次,隻需下載下傳它們一次。

  驗證 XML 代碼并對其字元進行編碼

  使用 XML 文檔的主要困難在于檢查其内部有效性(文檔邏輯的内聚性)。需要執行文法檢查以了解是否所有的标記和定義都是正确的并且被正确地調用。隻有文法檢查通過之後,才能确認 XML 文檔格式良好并可以解析文檔的邏輯結構。XML 文檔由 XML 解析器驗證。

  所有以下描述的 Eclipse XML 插件都能夠執行 XML 驗證,指出代碼中的警告和錯誤。如果試圖打開一個 XML 文檔,XML 解析器可能會生成一個錯誤。可以檢索精确的錯誤代碼、錯誤文本甚至導緻錯誤的那一行。可以在需要時驗證 XML 文檔,或在儲存文檔時自動驗證。可以将驗證錯誤任務作為一組進行清除。XMLBuddy 插件使用系統範圍的 XML 解析器,不過,請記住 Eclipse 平台帶有最好的 XML 解析器之一:Xerces(XML4J)。但并不限于 Xerces 或系統解析器,因為可使用 Run => External Tools => Configure 指向其它 XML 解析器。

  另一個重要的 XMLBuddy 功能是支援不同的字元編碼。這遲早會有用,例如,當需要使用以不同語言(如波蘭語和英語)編寫的 XML 可移植文檔時。這不是一項簡單的任務,因為編碼波蘭語字元主要有三種方法:其一是由 Windows 9x/2000 使用的 Windows Latin-2(CP1250);其二是在網際網路中使用以及由 UNIX 與類 UNIX 系統(如 Linux)使用的 ISO Latin-2(ISO8859-2);其三是 MacOS 和 MacOS X,它們對波蘭語使用不同的字元編碼标準。

  通常,XMLBuddy 為字元編碼提供兩種解決方案:根據檔案内容自動檢測 XML 文檔編碼,或将其設定為預設的編碼。預設的編碼可以在工作空間範圍,也可特定于資源。要打開 XML 編碼首選項,可選擇 Window => Preferences => XML => Encoding。

  這些針對字元編碼的解決方案的問題在于:對 XML 而言,一種編碼(每個工作台一種)不能适應全部情況。XML 文檔可能來自世界各地任意數量的來源。在許多情況下,使用者不能控制其他人對文檔的編碼,而且可能沒有辦法按編碼界限劃分工作。同一編碼首選項将很難同時适合(比方說) Java 源檔案和 XML 文檔。當一組全局首選項不能滿足需要時,XMLBuddy 為每個文檔提供屬性。指定項目中每個檔案的屬性是一項繁重的任務。但是,當要處理的某一文檔使用了不常用的編碼(不能自動檢測該編碼,并且沒有在文檔中指定)時,則屬性是唯一的解決方案。要打開特定檔案的編碼屬性,可在檔案上單擊滑鼠右鍵并選擇 Properties = > XML => Encoding。圖 4 顯示了如何設定全局字元編碼。

用Eclipse進行XML開發

圖 4. 在 Eclipse 中設定 XML 文檔的全局字元編碼

  DTD vs. XML Schema

  XML Schema 指定 XML Schema 定義語言,該語言提供了描述 XML 1.0 文檔結構和限制其内容的工具,其中包括那些利用 XML Namespace 的工具。模式語言自身用 XML 1.0 表示并使用名稱空間,它在很大程度上重構了 XML 1.0 DTD 具有的能力,并在一定程度上擴充了這些能力。請記住 DTD 有許多局限:

  □ 對于複雜需求通常很難使用内容模型。

  □ 不支援名稱空間。

  □ 對子產品化和重用的支援非常有限。

  □ 不支援對聲明擴充或繼承。

  □ 編寫、維護和讀取大型 DTD 以及定義系列相關模式都很困難。

  □ 沒有嵌入式、結構化自我文檔編制(self-documentation)(隻有 <!-- comments --> 可用)。

  □ 内容和屬性聲明不能依靠屬性或元素上下文(許多 XML 語言用到這一點,但它們的 DTD 必須“允許過多東西”)。

  □ 隻能使用一個簡單的辨別屬性機制(換句話說,沒有唯一性作用域)。

  但 XML Schema 也有不足:

  □ XML Schema 比較複雜;隻需要偶爾使用 XML 的程式員可能覺得它難得有些過頭。

  □ XML Schema 不能請求特定的根元素(是以,即使驗證最簡單的文檔也要求額外的資訊)。

  □ 當描述混合内容時,根本無法限制字元資料。

  □ 内容和屬性聲明不能依靠屬性或元素上下文(這也是 DTD 的主要問題)。

  □ 不能離開聲明指定預設值。

  □ 元素預設值隻能是字元資料(不包含标記)。

  XMLBuddy 對 DTD 和 Schema 都提供了足夠的支援,但如果您需要真正優秀的 XML Schema 支援,應該使用 XSD-XML Infoset Browser for Java 插件。它是按照 W3C XML Schema 規範中描述的那樣實作 XML Schema Infoset Model 的 Java 參考庫。它對于任何檢查、建立或修改 XML Schema 的代碼都非常有用。XML Infoset Browser 提供操作 XML Schema 元件的 API,以及操作以一系列 XML 文檔的 XML Schema 的(DOM 可通路的)表示的 API。XML Infoset 基本上允許兩個或兩個以上的程式員同時使用 Java 和 XML,是以提供了識别和建立基于 XML 的模式的标準方法。

用Eclipse進行XML開發

圖 5. 安裝 IBM XML SQC 之後 XML Schema 驗證變得可用

  XML Infoset Browser 的必要補充是 IBM XML Schema Quality Checker,簡稱 SQC(請參閱圖 5 )。SQC 是 Java 程式,它擷取以 W3C XML 模式語言編寫的 XML Schema 作為輸入,然後診斷 Schema 語言不正确的使用。SQC 讀取符合最新 XML Schema 規範的 Schema,并嘗試确定它們在應用于 Schema 的各種限制下是否有效。當 SQC 遇到不符合規範的元素時,它給出診斷消息,其中可能包含關于如何修正問題的建議。對于由許多 Schema 文檔(這些文檔間通過 <include>、<import> 或 <redefine> 元素資訊項連接配接)組成的 Schema,執行完整的 Schema 檢查。SQC 還可以以批處理方式運作,通過一次運作檢查多個 XML 模式。

  其它 Eclipse XML 插件

  其它有用的 XML 插件有 Transclipse 和 Eclipse Tidy。Transclipse 是 XML 轉換插件。它用任何符合 JAXP 的 XSL 樣式表處理器通過 XSLT 處理 XML 文檔,并使用 Apache 格式化對象處理器(Formatting Objects Processor,FOP)處理 XSL-FO 文檔。Transclipse 是 j2h(Java 至 HTML,Java to HTML)插件的一部分,j2h 将 Java 源代碼轉換成帶文法突出顯示的 HTML、XHTML 和 LaTeX。Eclipse Tidy 項目提供了格式化和列印 XML/HTML 文檔的插件。