XML 概況
XML解析器介紹
搭建MSXML的使用環境
MSXML 中的DOM模型
XML 概況
可擴展標記語言(Extensible Markup Language 簡寫為XML)與HTML一樣屬于標準通用標記語言(Standard Generalized Markup Language 簡寫SGML)的子集。由于XML具有簡潔有效、易學易用,是開放的國際化標準和高可擴展性等優點,所以可預見XML將被更為廣泛地使用。
XML解析器介紹
為了在日常的工作中操作XML文件,我曾經也封裝了一個XML的操作類。這個類可以完成添加節點,刪除節點,修改節點的功能,但是我到現在還是沒有找到一個方案封裝查找節點的行為,由于存在一個這樣的缺陷,所以也就一直不敢發表。封裝的類底層操作是通過MSXML來完成,我只不過為眾多常用的應用提供方便。MSXML提供了兩種方式來解析XML,分別是DOM和SAX的方式,功能頗為強大豐富。當通過C++來使用MSXML時,因為會涉及到接口和智能指針等一些COM類型或者結構等,所以使用起來也須細心地照管好接口等,否則較容易出現未釋放或者釋放空指針等的錯誤。通過腳本語言來使用MSXML就很方便,我們不用再自己去照管接口等。在網頁我們經常可以看見javascript使用MSXML來操作XML的例子。
在前陣子,我也經常使用CMarkup類。由于我使用的是免費的,這個類可以從網上下載。使用起來也非常簡單直觀,可以說易使用性相當高。畢竟是免費的,所以它的功能有限,存在不能刪除節點的不足,如果在應用中要刪除節點時就不適合了。所以在使用這個類時,我還是搭著自己封裝的類來使用。
曾經,為項目組到底該應用哪種XML解析器而思慮了些日子,也曾去試過一些庫。如TinyXml,它只支持DOM方式解析XML,就一般的應用來說基本上都是選DOM方式來操作XML。通過使用認為可以說它完全可以滿足我們的需要,但是它支持char字符類型,這給應用帶來了些麻煩,為了使用它我們必須為它傳char字符,但我們在應用開發中都是要用TCHAR這種字符類型,經常的字符轉換增加了復雜性。我真的希望它是支持UNICODE的,在網上也曾看過文章介紹如何讓它支持UNICODE,可我還沒有嘗試過。
C++解析XML庫除了上面列舉的幾種之外,還有ACE和Xerces。Xerces是一個開放源碼的庫,而且還支持SAX模型。這里主要介紹MSXML,如果應用程序要求在非 windows系統下運行,就不適應用MSXML。
搭建MSXML的使用環境
MSXML是Microsoft XML Core Services短語的縮寫詞。通過一組織良好的COM接口向用戶提供操作XML的高效方法,COM服務器一般隨著windows操作系統一起安裝。COM服務器(這里是指msxml版號.dll)位于windows\System32目錄下,這個目錄下通常會有多個MSXML*.dll,在使用時可以根據需要而選擇適當的服務器。關于各個版本的功能或者說差異可以查看相關的文檔,一般來說后續的版本是以前版本的升級,功能上都有所增強。
由于MSXML是通過COM服務器來提供,在使用COM服務器時我們必須能知道其中接口和GUID等信息。目前,主要有以下幾種方式來提供:(1)頭文件,(2)tlb文件
(3)直接通過導入DLL的方式來得到。在幫助文檔中介紹的是使用第三種方式,#import <msxml6.dll> 在導入時我們可以指定較多的選項,如命名空間,接口包裝等等。我通常使用的是第三種方式。在導入之后,我們可以用原始的COM接口方式,也可以使用經過簡單包裝的智能接口來編寫程序。在使用包赱的智能指針類時,為了不與SDK的Include目錄中的msxml*.h中的定義沖突,在編寫程序時可以使用帶命名空間的方式訪問,命名空間可以看debug目錄的.tlh文件。
MSXML 中的DOM模型
MSXML的DOM模型編程接口主要有DOMDocument,IXMLDOMNode,IXMLDOMNodeList(節點集合),IXMLDOMNamedNodeMap(屬性集合)。從下面這張圖中可以看出有許多其它的接口IXMLDOMElement、IXMLDOMText等等,它們都是以IXMLDOMNode為基類。這些接口都可以與XML中的DOM元素都可以對應起來。IXMLDOMDocument就對應了XML文檔,這個接口還實現持久化的接口。
XML中的DOM模型如下,這個圖和xml摘自互聯網。
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
IXMLDOMDocument對應整個文檔,IXMLDOMElement對應<bookstore>,<book>,<title>,<ahutor>,<year>,<price>等。IXMLDOMText對應著Everyday Italian等及屬性中的值。IXMLDOMAttribute對應著category="CHILDREN",屬性節點中包含有IXMLDOMText節點。