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