轉: http://www.ibm.com/developerworks/cn/xml/x-ctlbx/
設計您自己的 XML 方言
XML 方言隻是一組特殊的 XML 标記,以及一些關于如何組合這些标記的規則。目前,指定或定義 XML 方言的兩種主要方式是通過文檔類型定義(DTD)或 XML 模式。我将把這兩者都稱作 模式。
您的項目域也許已經有了一個為您設計的特定模式。如果沒有,您可以使用純文字編輯器建立自己的模式。更精細的方法是使用可以檢查文法的真正 方言設計器。(當以後嘗試使用錯誤的模式來驗證 XML 資料時,該模式不會起作用。)
設計工具
目前,大多數程式員的文本編輯器 ― 尤其是在 IDE 中找到的文本編輯器 ― 擁有正規的宏和模闆支援,可用于某些特性,如文法突出顯示和自動完成部分輸入的字或短語。是以,我省略了關于任何隻執行文法突出顯示和自動完成的 XML 編輯器的讨論。Microsoft Word 或 Emacs 宏就可以實作這些特性,是以“XML 編輯器”應該有更多特性。
表 1 中顯示的工具分為三種類别:
- IDE(內建開發環境,即瑞士×××方法)
- 模式敏感的 XML 編輯器(補充在模式或 DTD 中找到的許可标記結構和屬性)
- 模式設計器(用于編寫自己的模式或 DTD)
因為表 1 中的所有工具都運作應用程式,是以它們适合于所有 XML 開發人員 ― 不僅是那些使用 C++ 的開發人員(與本文中其它表中列出的工具不同)。
表 1. 各種平台的方言設計工具
産品 | 供應商 | 描述 | 許可證 | 平台 |
Turbo XML | TIBCO/Extensibility | XML 模式/DTD 設計器和 IDE | 商業 | Java、Win32 |
Komodo | Active State | XML 編輯器和 IDE | Linux、 Win32、其它 | |
XML Spy | Altova | 用于 XML 編輯和模式設計的 IDE | Win32 | |
XML Notepad | Microsoft | XML 編輯器 | 免費 | |
Morphon XML | Lunatech Research | 模式敏感的 XML 資料編輯器 | Java | |
XED | 愛丁堡大學 | 非商業 | Win32、 Linux、Unix | |
Xeena | IBM alphaWorks | 免費試用/商業 | Mac、Unix、Win32 | |
Visual XML | Pierlou | |||
Netpadd | Phillip Lenssen | Microsoft 的 XML Notepad 的替代品 | ||
XMetal | Softquad | DTD 敏感的 XML 編輯器 | ||
Merlot | Channelpoint | 可視 XML 編輯器;支援 DTD 插件 | ||
XML Validator | ElCel Technologies | 指令行 XML 驗證工具 | ||
XML Canon | 通過将 XML 資料與 DTD 合并來生成規範的 XML |
C 和 C++ 工具
本文的其餘部分提供了通過軟體庫向 C/C++ 程式員添加 XML 功能的基礎。在本文的下一部分中,您将發現可以找到更多的指令行實用程式,軟體庫包含了它們作為測試和/或樣本程式。例如,Transformiix 可以用作一個庫、Perl 子產品或指令行工具。
解析器
一旦您擁有了 DTD 或模式以及與其相配的 XML 文檔,就需要一個解析器來讀取并解釋該 XML 文檔。 表 2概述了 C/C++ 開發人員的解析器庫。可是,在開始研究表中的網格時,需要一點背景知識。
驗證
XML 解析器有兩種形式:驗證和非驗證。您需要哪一種呢?如果您不使用正式的 DTD 或模式,驗證特性對于您來說并不重要。如果您已經或者正在計劃使用 DTD 或模式,您也許會首選驗證解析器。(在這種情況下,我建議您還要學習如何閱讀和手工寫 DTD/模式,這樣當發生驗證問題時,您就可以處理錯誤。有時,錯誤在 DTD/模式中,是以您可以調試 DTD/模式檔案和 XML 資料。)
解析器 API 模型
用于将軟體與 XML 解析器結合的兩種常用 API 模型是:文檔模型和事件模型。文檔 API 模型對 XML 資料進行解析以生成一個對象。對象将文檔的内容抽象成樹結構。應用程式對這個樹結構對象進行操作。事件 API 模型使用回調機制向應用程式通報 XML 資料的結構。事件/回調通常在進行解析時發生。
API 标準:DOM 和 SAX
一般解析器 API 模型已經被進一步改進成特定 API 标準。W3C 已經推薦 DOM(級别 1 和 2,級别 3 正在草拟中)作為标準化文檔 API 模型。SAX 雖然不是 W3C 項目,但它已經占有了事實上的标準事件 API 模型的地位。
W3C 标準
當比較解析器和其它 XML 工具中的特性時,請尋找 W3C 推薦的和正在形成的規範的支援,如名稱空間、XPath、XLink、XInclude 和 XInfoset。請記住,XML 技術成熟得非常快,對第一級規範(如 DOM)的支援也許缺少了該規範第二級中引入的重要功能。如果最新規範形式的功能對于您的項目很重要,請相應地選擇工具。
閱讀下表
在表 2 中,“事件”欄指定了支援一個推或事件模型 API(如 SAX)的解析器。“文檔”欄指定了支援拉或文檔模型 API(如 DOM)的解析器。與前面一樣,該表列出了商業和非商業工具(請參閱側欄 發放許可證以擷取關于軟體許可證的詳細資訊)。
表 2. C/C++ 開發人員的解析器
庫 | 事件 | 文檔 | 特點 | ||
expat | James Clark/expat 小組 | 本機與 SAX | - | 帶有本機 API 和 SAX 封裝器的、非常快速的推模型解析器。 | LGPL(免費) |
libxml | Gnome | SAX | DOM | 非常強壯;SAX 與 DOM 封裝器;執行 DTD 驗證 | |
MSXML | Win32 的 Microsoft XML 庫 | EULA(免費) | |||
Xerces | Apache Software Foundation | 執行 SAX 及 DOM 級别 1 和 2;DTD 驗證;增加的 XML 模式 | Apache(免費) | ||
XTL | Vivid Creations | 帶 SAX 和 DOM 的基于 STL 的 XML 工具箱 | |||
RXP | 本機 | 驗證以 C 編寫的了解名稱空間的 XML 解析器 | GPL(免費) | ||
XML4C | IBM 發起的 Xerces 的變體 | ||||
Oracle XDK 8i | Oracle | Oracle 主辦的用于 C++ 的 XML 工具箱 | |||
Pull Parser | Extreme! Lab | 印地安那大學發起的用于 C++ 的輕量型 XML 工具箱 | |||
XML Booster | PhiDaNi Software | 解析器發生器,生成 C 源碼解析器 |
三種最流行的開放源碼 XML 庫是 expat、libxml 和 Xerces。這三者都是跨平台的,每一種都充當 XSLT 庫實作的基礎,一旦滿足了基本 XML 需要之後,它就會給您一條成長途徑。
- expat 是 James Clark 創始的開放源碼面向事件的 XML 解析庫。他已經将該項目轉讓給了 SourceForge 中的一個小組。有一個 SAX 封裝器可供使用。在許多項目中都可以找到 expat 解析器,如開放源碼浏覽器 Mozilla、XSLT 處理器 Transformiix 和 RDF 工具 repat。
- libxml 為類似于 SAX 和 DOM 的操作提供了雙重方式 API。它支援對 DTD 的驗證,并且在 Gnome 的 XSLT 處理器 libxslt中使用。libxml 經過重寫,已作為 libxml(2) 釋出,也許還稱為 libxml2。這個庫的使用者應該確定他們擁有了目前版本。
- Xerces 是非常堅固的、擁有大量文檔的庫,它充當 IBM alphaWorks XML4C 庫的基礎。Xerces 還用于 Apache XSLT 處理器 Xalan 中。Xerces 支援 DOM、SAX,以及對 DTD 的驗證。最新版本讀取并解釋了部分“W3C XML 模式推薦”(打算到 2001 年底實作完整的 XML 模式支援)。
将這三種最流行的庫其中一種編譯并連結到您的項目毫不費力。大多數軟體包都包括了每個平台的詳盡說明。這裡是一些樣本安裝說明。
在 Windows 上建構開放源碼庫
在 Windows 上從頭建構 libxml是很簡單的四個步驟:
- 下載下傳源 tarball 檔案。
- 使用諸如 Winzip 之類的程式将内容解壓縮到一個目錄中。請确認訓示了解壓縮實用程式保留 libxml可能需要的任何子目錄的路徑名。
- 定位
子檔案夾中的./win32/dsp
檔案,并從 MS Developer Studio 中打開它。libxml2.dsw
- 從 DevStudio 中的頂部菜單選擇 Build All。這将建構所有樣本和測試程式,以及運作它們所需的 libxml DLL。
可以使用上述步驟在 Windows 上建構 Xerces。唯一的差別就是查找
./c/samples/Projects/Win32/VC6
samples.dsw
工作空間檔案。
expat 已經開始包括了 DSP 項目 makefile。請檢視
lib
和
xmlwf
子檔案夾。
在 Unix 上建構開放源碼庫
對于在 Linux 或 Unix 上運作的項目,大多數情況下,您可以将源代碼解包(untar)到一個空目錄中,設定某些選項,然後輸入“make”來建構共享庫。Solaris 使用者:不要忘記使用 GNU 解包實用程式。在 Slackware Linux 下的 bash shell 中,我使用以下代碼:
|
XML 和 COM
MSXML 是 Microsoft 針對 Windows 系列作業系統提供的專利 XML,它被實作成一個可腳本化的 COM 對象集合,是以可以在其它語言環境中出色地工作,而且提供了大量文檔。這個庫支援 DOM,而且還有一個本機面向文檔的接口。它還支援 SAX 事件。
作為 MSXML 的替代品,“Apache XML 項目”的 Xerces 庫附帶了一個 COM 封裝器,這可以使它在許多情況下充當 MSXML 的仿制品。Vivid Creations 在它的 XTL 庫中提供了 SAX 和 DOM API 的 COM 封裝器,該産品也是 MSXML 的替代品。
XML 轉換:XSLT 和 XQuery
轉換是 XML 發展過程中從隻是在元素和屬性級别處理 XML 資料向前進階的下一步。XML 轉換對進入 XML 資料進行操作,以産生 XML 輸出。轉換可以重新組織标記結構、添加/除去标記和屬性、進行過濾以放大 XML 資料的所選擇部分。
XQuery 文檔将轉換過程稱作查詢,但含義是一樣的。
XSLT 和 XQuery 是 XML 方言,用于指定如何對随機 XML 資料執行這樣的操作。您可以編寫一個腳本檔案,改用 XSLT 或 XQurey 來代替 XML,進而代替将一些 XML 資料裝入到 DOM 中,而且必須由程式操縱 DOM 版本來産生期望的結果。這種更通用的方法會産生更好的靈活性,并會縮短開發時間。現在,您的 Web 開發人員(他們不是 C/C++ 程式員)可以編寫自己的 XML 轉換,這可以讓 C++ 程式員來完成更複雜的工作。
表 3. C/C++ 轉換/查詢庫
libxslt | 建構在 libxml 之上 | ||
Xalan | Apache | 建構在 Xerces 解析器之上 | |
Transformiix | MITRE | 建構在 expat 之上的 XSLT 處理器 | |
xsltc | Oliver Gerardin | XSLT 編譯器,産生 C 代碼 | |
sablotron | Ginger Alliance | XSL 引擎 |
消息傳遞:XML-RPC 和 SOAP 工具
對本文來說, 消息傳遞是指讓兩個軟體代理程式互相通信。這種消息傳遞有時稱作面向消息的中間件。(這不是類似于 AOL、MSN 或 ICQ 的消息傳遞,知道嗎?現在 有一個尚處于未完成階段的基于 XML 的即時消息傳遞協定成果稱作 Jabber。我已經在 參考資料中包含了一個連結以滿足您的好奇心,但再次聲明,那并不是我要在這裡讨論的東西。)
使用 XML 進行消息傳遞已經非常流行,以至于已經産生了兩個替代品:XML-RPC 和 SOAP。這些協定最顯著的特征是根據開發人員用于實作的工具選擇,客戶機、伺服器和同級裝置可能會大相徑庭。雖然所有開發人員都習慣使用他們偏愛的語言、開發工具箱或軟體庫,但他們仍然可以合作。
(附帶說明:Gregor Purdy 已經用已提議的替代方法編寫了一篇出色的 XML-RPC 評論(請參閱 參考資料))。
表 4 包括了用于面向消息中間件類别的一些庫。這并不是一個此類别中資源的詳盡清單,有一些新的工具正在快速發展,但它是一個好的起點。
表 4. C/C++ 消息傳遞庫
4S4C SOAP 服務 | Simon Fell | 開放源碼 SOAP 成果 | Linux、 Unix、Win32 | |
SOAP 客戶機 | SQL Data | C++ SOAP 客戶機工具箱 | ||
SOAP 元件 | mozilla.org | 可腳本化 XPCOM 元件 | 許多 | |
XML-RPC for C/C++ | First Peer | C 語言編寫的 XML-RPC 庫 | ||
XML-RPC 元件 | ||||
Epinions |