|
|
| 內容: |
|
| 兩套工具 |
| 設計您自己的 XML 方言 |
| 設計工具 |
| C 和 C++ 工具 |
| 解析器 |
| XML 轉換:XSLT 和 XQuery |
| 訊息傳遞:XML-RPC 和 SOAP 工具 |
| 結束語 |
| XML 術語 |
| 參考資料 |
| 關於作者 |
| 對本文的評價 |
|
|
| 相關內容: |
|
| Java developers' XML toolbox |
| Perl 開發人員的 XML 工具箱 |
| PHP 開發人員的 XML 工具箱 |
| dW XML 的更多參考資料 |
|
|
對循序漸進使用 XML 的 C 和 C++ 程式員的工具的建議 Rick Parrish(rfmobile@swbell.net) 獨立顧問 2001 年 9 月
本文針對哪些不熟悉 XML 開發的 C 和 C++ 程式員,概述了為 XML 開發作準備而裝配的工具。工具表概述了常規 XML 工具,如 IDE 和模式設計器、解析器、XSLT 工具、SOAP 和 XML-RPC 庫,以及其它可以在 C 和/或 C++ 中使用或者實際上以 C 和/或 C++ 編寫的庫。本文包括了關於在 Windows、Unix 和 Linux 上安裝開放源碼庫的建議,還有關鍵 XML 術語的簡要詞彙表。
似乎滿眼望去,一些新的以源碼形式發布的與 XML 相關的工具都是用 Java 編寫。儘管 Java 在 XML 競技場中佔有明顯優勢,許多 C/C++ 程式員還是在進行 XML 的開發,而且現在有許多 XML 工具可供 C 和 C++ 程式員使用。我們將面對 XML 庫問題,如驗證、模式和 API 模型。接著,我們將研究常規 XML 工具的集合,如 IDE 和模式設計器。最後,我們將用一個列表進行總結,並且討論可以在 C 和/或 C++ 中使用或者實際上以 C 和/或 C++ 編寫的庫。 在本文中,將跳過關於使用 XML 的爭論;我假設您已經擁有充分的理由來等待掌握這種技術。另外,我們將把 XML 的更詳細說明留給參考資料中的背景資源講述。只要說 XML 是資料交換的標準(不僅是檔案格式)就夠了。資料可以是以 XML 格式的應用程式檔案形式來進行交換的,或者通過網路連接進行交換,該網路連接只是因線上事務結束或網路連接關閉而遭到放棄之前存在短暫片刻。 此外,本文並不是評價工具的比較性評論。我的目的是說明您可能需要的工具類型,並向您指出可能的候選工具。您仍需要根據項目需要來研究、測試和比較工具特徵,以裝配最終的工具箱。 兩套工具 要將 XML 合并到自己的軟體項目中,在您的工具箱裡應該有兩套工具。第一套是方言設計器(或者更適當的叫法是“模式設計器”)。第二套工具包括將解析和 XML 產生特性添加到應用程式的軟體庫。 設計您自己的 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 編輯器 |
免費 |
Win32 |
| Morphon XML |
Lunatech Research |
模式敏感的 XML 資料編輯器 |
商業 |
Java |
| XED |
愛丁堡大學 |
模式敏感的 XML 資料編輯器 |
非商業 |
Win32、Linux、Unix |
| Xeena |
IBM alphaWorks |
模式敏感的 XML 資料編輯器 |
免費試用/商業 |
Mac、Unix、Win32 |
| Visual XML |
Pierlou |
模式敏感的 XML 資料編輯器 |
非商業 |
Java |
| Netpadd |
Phillip Lenssen |
Microsoft 的 XML Notepad 的替代品 |
非商業 |
Win32 |
| XMetal |
Softquad |
DTD 敏感的 XML 編輯器 |
商業 |
Win32 |
| Merlot |
Channelpoint |
可視 XML 編輯器;支援 DTD 外掛程式 |
非商業 |
Java |
| XML Validator |
ElCel Technologies |
命令列 XML 驗證工具 |
非商業 |
Win32 |
| XML Canon |
ElCel Technologies |
通過將 XML 資料與 DTD 合并來產生規範的 XML |
非商業 |
Win32 |
C 和 C++ 工具 本文的其餘部分提供了通過軟體庫向 C/C++ 程式員添加 XML 功能的基礎。在本文的下一部分中,您將發現可以找到更多的命令列公用程式,軟體庫包含了它們作為測試和/或樣本程式。例如,Transformiix 可以用作一個庫、Perl 模組或命令列工具。
| 發放許可證 在所有工具表中,商業許可證表示必須購買該工具,才能將它用於產品環境中。試用版本(有時間限制或者禁用了主要特性)通常可供下載和評估。所有其它工具都有非商業許可證,不需要支付費用就能使用,但如果將它們用於商業項目中,請確保您將遵守許可證條款進行使用。例如,使用任何開放源碼作為共用庫或 DLL,應符合這些 XML 庫附帶的開放源碼許可證協定(通常是 LGPL)。在表中,當可能不完整安裝工具就能確定許可證類型時,就會指定非商業許可證的類型;該表使用 非商業來指定許可證條款比較模糊的免費軟體。 常用的開放源碼是 Apache、GPL、BSD 和 LGPL。並不允許在商業軟體包中包含 GPL 代碼,而 Apache 和 LGPL 代碼可以在銷售的軟體中使用。這四個產品都限制在沒有得到許可的情況下在派生產品中使用它們的名稱。 |
到現在為止,我嘗試盡量少用 XML 相關的術語。可是,在您進一步閱讀之前,如果還不熟悉 XML 基礎知識,您也許應該瀏覽在 XML 術語側欄中定義的術語。這些術語將協助您理解本文的其餘部分,並且在您親自深入研究所提到的工具和庫時協助挑出它們的特徵。 解析器 一旦您擁有了 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 驗證 |
LGPL(免費) |
| MSXML |
Microsoft |
SAX |
DOM |
Win32 的 Microsoft XML 庫 |
EULA(免費) |
| Xerces |
Apache Software Foundation |
SAX |
DOM |
執行 SAX 及 DOM 層級 1 和 2;DTD 驗證;增加的 XML 模式 |
Apache(免費) |
| XTL |
Vivid Creations |
SAX |
DOM |
帶 SAX 和 DOM 的基於 STL 的 XML 工具箱 |
商業 |
| RXP |
愛丁堡大學 |
- |
本機 |
驗證以 C 編寫的瞭解名稱空間的 XML 解析器 |
GPL(免費) |
| XML4C |
IBM alphaWorks |
SAX |
DOM |
IBM 發起的 Xerces 的變體 |
Apache(免費) |
| Oracle XDK 8i |
Oracle |
SAX |
DOM |
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 子檔案夾中的 libxml2.dsw 檔案,並從 MS Developer Studio 中開啟它。
- 從 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 |
Gnome |
構建在 libxml 之上 |
非商業 |
| Xalan |
Apache |
構建在 Xerces 解析器之上 |
Apache(免費) |
| 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 客戶機工具箱 |
商業 |
Win32 |
| SOAP 組件 |
mozilla.org |
可指令碼化 XPCOM 組件 |
非商業 |
許多 |
| XML-RPC for C/C++ |
First Peer |
C 語言編寫的 XML-RPC 庫 |
非商業 |
Linux、Unix、Win32 |
| XML-RPC 組件 |
mozilla.org |
可指令碼化 XPCOM 組件 |
非商業 |
許多 |
| XML-RPC for C/C++ |
Epinions |
C 語言編寫的 XML-RPC 庫 |
非商業 |
Linux、Unix、Win32 |
題外話 這些工具應該給您的 XML 工具箱一個很好的起點。如果想要推薦已經嘗試過的其它用於 XML 的 C/C++ 工具或者要發表任何其它意見,請加入本文所附的討論中(請使用“參考資料”中的連結或單擊文章頁面頂部或底部的“討論”表徵圖)。 XML 術語
這些 XML 術語也許會在您理解本文中討論的庫時派上用場:
- 文檔模型:用於將 XML 資料當作樹型對象進行解析和操縱的技術,也稱作“拉”模型。請參閱作為樣本的 DOM API 標準。
- DOM:“文件物件模型”是 XML 文檔的一種特殊樹型結構編程模型,W3C 將它描述成一個標準。DOM 標準目前分成三個層級。DOM 1.0 是指 DOM 層級 1.0 一致性;DOM 層級 2 是最新的規範,W3C 正將它認可為“推薦”;DOM 層級 3 在本文創作時正在草擬中。
- DTD:文件類型定義。一種 XML 檔案,定義了 XML 元素和那些元素的 XML 屬性,而且指定了如何嵌套 XML 標記以及元素可以包含什麼資料的規則。請參閱 Jane Fung 的XML 和 DTD 簡介以擷取更多詳細資料。
- 事件模型:用於通過使用回調或處理常式對 XML 資料進行解析的技術;也稱作“推”模型。例如,請參閱 SAX API 標準。
- 名稱空間:明確從不同的 DTD 或模式中標識出 XML 標記的方法,這樣它們可以混合在同一個 XML 文檔中。RDF 非常依賴於這個特性;XML 1.0 標記“xmlns”可以用於在 XML 文檔中定義名稱空間。
- RDF:資源描述架構,用於將 XML 屬性資料和通常駐留在別處的資訊相關聯的一種壓縮 XML 方言。您的驅動程式的許可證就類似於描述您的 RDF XML 檔案。
- SAX:Simple API for XML 是用於 XML 解析器實現的標準編程介面;SAX 使用面向事件的編程模型。SAX 是由 David Megginson 最早開發的事實上的標準,現在由 XML-dev 郵件清單維護。
- SOAP:“簡易物件存取通訊協定 (SOAP)”是類似於 XML-RPC(請參閱 XML-RPC)的網路通訊協定。通過使用 SOAP,應用程式可以建立遠程對象、調用該對象上的方法,以及檢索結果。
- 驗證:關於 DTD 和模式,驗證結構良好的 XML 文檔是否正確。
- 結構良好:一個 XML 文檔,它的標記和資料符合 XML 1.0 文法。
- W3C:世界全球資訊網聯盟,它已經成為大多數 XML 相關技術的重要標準主體。W3C 將最終認可的規範稱作“推薦”(而不是標準)。
- XML 1.0:W3C 頌揚的第一個 XML 文法標準;建立了 XML 資料的基本規則,如所有標記都必須以斜杠(
/)結束,如:,或者後跟一個結束標記,如: close the tag on your way out。
- XML-RPC:XML 遠端程序呼叫。XML-RPC 是用於跨網路調用方法和服務的標準 XML 方言;就象您認為的那樣,XML-RPC 使用 XML 進行客戶機和伺服器之間的訊息傳遞。
- XML 模式:XML 模式是一種 W3C 推薦,它類似於 DTD,用於定義 XML 文檔的結構,但具有更好的靈活性。XML 模式使用 XML 1.0 文法來指定模式,這與用於 DTD 的比較早期的 SGML 文法相反。
- XQuery:其部分功能類似於 XSLT,但設計得更有利於充當 XML 資料的查詢語言 — 類似於在關聯式資料庫中使用 SQL。作為規範,它還不如 XSLT 成熟,XQuery 也許會成為今後十年裡的 SQL。
- XSLT:可擴充樣式語言轉換,一種用於轉換 XML 內容的 XML 方言。將 XSLT 檔案應用於某些 XML 輸入資料,以產生期望的 XML 輸出資料。
|
參考資料
- 將您對 C/C++ 工具的見解或問題添加到本文的討論中。(您可以使用此連結,或者單擊頁面頂部或底部的“討論”表徵圖。)
- 請訪問 W3C XML 頁面,該頁面提供了 XML 規範中的大部分內容。
- 請訪問 XML 相關軟體的匯總網站。
- 請在此使用 Zvon 的通用 XML 教程或 developerWorks 的 Doug Tidwell 撰寫的 XML 入門以及 XML 專區教學地區中的其它課程來擷取 XML 的基礎知識。
- 請閱讀 Howard Katz 的 XQuery 簡介。
- 請認真閱讀 Gregor Purdy 撰寫的出色的 critique of XML-RPC。
- 請在 Jane Fung 的文章XML 和 DTD 簡介中學習編寫 DTD 的基礎知識。
- 請在 Michael Kay 的技術概述 XSLT 是什麼類型的語言?中瞭解 XSLT。
- 請在 Jabber 上瞭解其它類型的訊息傳遞(立即訊息)的資訊。
- 通過認真學習 IBM Certified Developer Program 的 XML Certification guidelines 來掌握 XML 開發人員技能。
本文中提到的 XML 標準
- XML 規範 1.0:W3C 核心 XML 1.0 規範。
- DOM 層級 1.0:W3C 文件物件模型層級 1 API 推薦。
- DOM 層級 2.0:W3C 文件物件模型層級 2 API 推薦。
- SAX/SAX2:Simple API for XML 事件模型事實上的標準。
- 名稱空間:處理 XML 名稱空間的 W3C 推薦。
- XML 模式:關於 W3C XML 模式推薦的一切
關於作者 Rick 是一個老資格的程式員,他的職業生涯就是炒股和克服期限,同時給女招待足以使她們臉紅的慷慨的小費。他的名字已經傳遍了小鎮裡的每一個咖啡館。他還喜歡在以技術為主題的研討會上發表演講。他的設計標新立異,現在他正在研究更時髦的建模方法,如 UML。他汽車的保險杆上寫著:“I for XHTML.”。可以通過 rfmobile@swbell.net 與 Rick 聯絡。 |
|