天天看點

XML - c++

轉: http://www.ibm.com/developerworks/cn/xml/x-ctlbx/

設計您自己的 XML 方言

XML 方言隻是一組特殊的 XML 标記,以及一些關于如何組合這些标記的規則。目前,指定或定義 XML 方言的兩種主要方式是通過文檔類型定義(DTD)或 XML 模式。我将把這兩者都稱作 模式。

您的項目域也許已經有了一個為您設計的特定模式。如果沒有,您可以使用純文字編輯器建立自己的模式。更精細的方法是使用可以檢查文法的真正 方言設計器。(當以後嘗試使用錯誤的模式來驗證 XML 資料時,該模式不會起作用。)

XML - c++
XML - c++

設計工具

目前,大多數程式員的文本編輯器 ― 尤其是在 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
XML - c++
XML - c++

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是很簡單的四個步驟:

  1. 下載下傳源 tarball 檔案。
  2. 使用諸如 Winzip 之類的程式将内容解壓縮到一個目錄中。請确認訓示了解壓縮實用程式保留 libxml可能需要的任何子目錄的路徑名。
  3. 定位

    ./win32/dsp

    子檔案夾中的

    libxml2.dsw

    檔案,并從 MS Developer Studio 中打開它。
  4. 從 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 中,我使用以下代碼:

tar -x 
      

XML 和 COM

MSXML 是 Microsoft 針對 Windows 系列作業系統提供的專利 XML,它被實作成一個可腳本化的 COM 對象集合,是以可以在其它語言環境中出色地工作,而且提供了大量文檔。這個庫支援 DOM,而且還有一個本機面向文檔的接口。它還支援 SAX 事件。

作為 MSXML 的替代品,“Apache XML 項目”的 Xerces 庫附帶了一個 COM 封裝器,這可以使它在許多情況下充當 MSXML 的仿制品。Vivid Creations 在它的 XTL 庫中提供了 SAX 和 DOM API 的 COM 封裝器,該産品也是 MSXML 的替代品。

XML - c++
XML - c++

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

繼續閱讀