• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            積木

            No sub title

              C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
              140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(1)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            原文轉(zhuǎn)自:http://m.shnenglu.com/tx7do/archive/2006/04/24/6146.html 

            TinyXml學(xué)習(xí)筆記

            張弛 <zhangchi@china.com>

            一、      TinyXml 的特點(diǎn)

            TinyXml 是一個(gè)基于 DOM 模型的、非驗(yàn)證的輕量級(jí) C++ 解釋器。

            1.      SAX  DOM

            目前 XML 的解析主要有兩大模型: SAX  DOM 

            其中 SAX 是基于事件的,其基本工作流程是分析 XML 文檔,當(dāng)發(fā)現(xiàn)了一個(gè)新的元素時(shí),產(chǎn)生一個(gè)對(duì)應(yīng)事件,并調(diào)用相應(yīng)的用戶處理函數(shù)。這種方式占用內(nèi)存少,速度快,但用戶程序相應(yīng)得會(huì)比較復(fù)雜。

             DOM (文檔對(duì)象模型),則是在分析時(shí),一次性的將整個(gè) XML 文檔進(jìn)行分析,并在內(nèi)存中形成對(duì)應(yīng)的樹結(jié)構(gòu),同時(shí),向用戶提供一系列的接口來訪問和編輯該樹結(jié)構(gòu)。這種方式占用內(nèi)存大,速度往往慢于 SAX ,但可以給用戶提供一個(gè)面向?qū)ο蟮脑L問接口,對(duì)用戶更為友好。

            另?yè)?jù)說,一些同時(shí)提供了 SAX  DOM 接口的庫(kù),是在底層先實(shí)現(xiàn) SAX ,再在 SAX 的基礎(chǔ)上實(shí)現(xiàn) DOM 

            目前我知道的 XML 解析庫(kù)有下面幾個(gè):

            名稱

            訪問接口

            是否支持驗(yàn)證

            備注

            Expat

            SAX/Local

            不清楚

            Local 指它還有一套自己訪問模型

            LibXML2

            SAX/DOM

             

            TinyXml

            DOM

             

            XML4C

            SAX/DOM

             Xerces-C 是一家,不過用了 ICU ,國(guó)際化似乎更好

            Xerces-C

            SAX/DOM

             

            XML Booster

            Local

            不清楚

            這個(gè)庫(kù)不是特別了解,好像是類似 yacc 那樣,可以生成一個(gè)特定的解析器,估計(jì)效率應(yīng)該很高(看名字也像)。

             

            2.      驗(yàn)證和非驗(yàn)證

            對(duì)于一個(gè)特定的 XML 文檔而言,其正確性分為兩個(gè)層次。首先是其格式應(yīng)該符合 XML 的基本格式要求,比如第一行要有聲明,標(biāo)簽的嵌套層次必須前后一致等等,符合這些要求的文件,就是一個(gè)合格的 XML 文件,稱作 well-formatted 。但除此之外,一個(gè) XML 文檔因其內(nèi)容的不同還必須在語(yǔ)義上符合相應(yīng)的標(biāo)準(zhǔn),這些標(biāo)準(zhǔn)由相應(yīng)的 DTD 文件或者 Schema 文件來定義,符合了這些定義要求的 XML 文件,稱作 valid 

            因此,解析器也分為兩種,一種是驗(yàn)證的,即會(huì)跟據(jù) XML 文件中的聲明,用相應(yīng)的 DTD 文件對(duì) XML 文件進(jìn)行校驗(yàn),檢查它是否滿足 DTD 文件的要求。另一種是忽略 DTD 文件,只要基本格式正確,就可以進(jìn)行解析。

            就我所知,驗(yàn)證的解析器通常都是比較重量級(jí)的。 TinyXml 不支持驗(yàn)證,但是體積很小,用在解析格式較為簡(jiǎn)單的 XML 文件,比如配置文件時(shí),特別的合適。

             

            二、      TinyXml 的構(gòu)建和使用

            1.      獲取

            TinyXml 首頁(yè)在 http://www.grinninglizard.com/tinyxml/index.html ,從這里可以找到最新版本的源代碼,目前的版本是 2.3.4 

            2.      構(gòu)建

            TinyXml 在構(gòu)建時(shí)可以選擇是否支持 STL ,選擇的話,則可以使用 std::string ,所以通常應(yīng)該打開這個(gè)選項(xiàng)。

             Windows 上, TinyXml 的源碼包里提供了 VC6 的工程文件,直接用它就可以生成兩個(gè)靜態(tài)庫(kù)(帶 STL 和不帶 STL ),非常容易。唯一需要注意的是,默認(rèn)生成的庫(kù)是單線程的,如果用在多線程的項(xiàng)目中,需要改動(dòng)一下配置,生成相應(yīng)的多線程庫(kù)。

             Unix 平臺(tái)上, TinyXml 的源碼包里只提供了一個(gè) Makefile ,對(duì)于典型的 Linux 系統(tǒng),或裝了 gcc  gmake 的其他 Unix ,這個(gè) Makefile 足夠用了,我在 RH9  RHEL4 上測(cè)試,簡(jiǎn)單的 make 就成功了。需要注意的有以下幾點(diǎn):默認(rèn)的編譯是不支持 STL 的,可以通過編輯 Makefile  TINYXML_USE_STL := NO 那一行,把 NO 改成 YES 就可以支持 STL 了;還有默認(rèn)只生成了一個(gè)測(cè)試程序,沒有生成任何庫(kù),如果要生成靜態(tài)庫(kù)的話,可以用ar 命令,將生成的幾個(gè)目標(biāo)文件打包就行了,如果要生成動(dòng)態(tài)庫(kù),則需要加上 -fpic 參數(shù)重新編譯。

            3.      使用

            構(gòu)建了相應(yīng)的庫(kù)之后,在使用了它們的工程中,只要在連接時(shí)把他們連上就行了。需要注意的是,如果需要 STL 支持,在編譯用到了 TinyXml 的文件時(shí),需要定義一個(gè)宏 TIXML_USE_STL ,對(duì) gcc ,可以使用參數(shù) -DTIXML_USE_STL ,對(duì) cl.exe  VC ),可以使用參數(shù) /DTIXML_USE_STL ,如果嫌麻煩,可以直接定義在 tinyxml.h 文件里。

             

            三、      TinyXml 的編程模型

            1.      類之間的關(guān)系

            TinyXml 實(shí)現(xiàn)的時(shí) DOM 訪問模型,因此提供了一系列的類對(duì)應(yīng) XML 文件中的各個(gè)節(jié)點(diǎn)。主要類間的關(guān)系如下圖所示:

            TiXmlBase :其他類的基類,是個(gè)抽象類

            TiXmlNode :表示一個(gè)節(jié)點(diǎn),包含節(jié)點(diǎn)的一般方法,如訪問自節(jié)點(diǎn)、兄弟節(jié)點(diǎn)、編輯自身、編輯子節(jié)電

            TiXmlDocument :表示整個(gè) XML 文檔,不對(duì)應(yīng)其中某個(gè)特定的節(jié)點(diǎn)。

            TiXmlElement :表示元素節(jié)點(diǎn),可以包含子節(jié)點(diǎn)和 TiXmlAttribute

            TiXmlComment :表示注釋

            TiXmlDeclaration :表示聲明

            TiXmlText :表示文本節(jié)點(diǎn)

            TiXmlUnknown :表示未知節(jié)點(diǎn),通常是出錯(cuò)了

            TiXmlAttribute :表示一個(gè)元素的屬性

            下面是一個(gè)簡(jiǎn)單的例子:

            <?xml version="1.0" encoding="utf-8" ?>

            <!-This is only a sample-->

            <book>

                   <name>TinyXml How To</name>

                   <price unit=”RMB”>20</price>

                   <description>Some words…</description>

            </ book >

            整個(gè)文檔,對(duì)應(yīng) TiXmlDocument

            book,name,price , description ,都對(duì)應(yīng) TiXmlElement

            第一行對(duì)應(yīng)一個(gè) TiXmlDeclaration

            第二行對(duì)應(yīng)一個(gè) TiXmlComment

            “TinyXml How To” 對(duì)應(yīng)一個(gè) TiXmlText

            unit 則是 price 的一個(gè) TiXmlAttribute

            這些類與 XML 文件中的相應(yīng)元素都有很好的對(duì)應(yīng)關(guān)系,因此相信參照 TinyXml 的文檔,可以很容易的掌握各個(gè)方法的使用。

             

            2.      需要注意的問題

            各類之間的轉(zhuǎn)換

            由于各個(gè)節(jié)點(diǎn)類都從 TiXmlNode 繼承,在使用時(shí)常常需要將 TiXmlNode * 類型的指針轉(zhuǎn)換為其派生類的指針,在進(jìn)行這種轉(zhuǎn)換時(shí),應(yīng)該首先使用由 TiXmlNode 類提供的一系列轉(zhuǎn)換函數(shù),如 ToElement (void) ,而不是 c++ dynamic_cast

             

            檢查返回值

            由于 TinyXml 是一個(gè)非校驗(yàn)的解析器,因此當(dāng)解析一個(gè)文件時(shí),很可能文件并不包含我們預(yù)期的某個(gè)節(jié)點(diǎn),在這種情況下, TinyXml 將返回空指針。因此,必須要對(duì)返回值進(jìn)行檢查,否則將很容易出現(xiàn)內(nèi)存訪問的錯(cuò)誤。

             

            如何重頭建立一個(gè) XML 文件

            先建立一個(gè) TiXmlDocument 對(duì)象,然后,載入某個(gè)模板,或者直接插入一個(gè)節(jié)點(diǎn)作為根節(jié)點(diǎn),接著就可以像打開一個(gè)已有的 XML 文件那樣對(duì)它進(jìn)行操作了。

             

            四、      總結(jié)

            TinyXml 最大的特點(diǎn)就是它很小,可以很方便的靜態(tài)連接到程序里。對(duì)于像配置文件、簡(jiǎn)單的數(shù)據(jù)文件這類文件的解析,它很適合。但是由于它是非驗(yàn)證的,因此需要在程序里做許多檢查工做,加重了程序編寫的負(fù)擔(dān)。因此對(duì)于復(fù)雜的 XML 文件,我覺得最好還是用驗(yàn)證的解析器來處理。

            posted on 2012-02-14 17:40 Jacc.Kim 閱讀(359) 評(píng)論(0)  編輯 收藏 引用 所屬分類: VC / C++
            亚洲中文字幕伊人久久无码| 婷婷伊人久久大香线蕉AV| 久久99热国产这有精品| 国产精品久久久久久久久免费| 91视频国产91久久久| 99久久综合国产精品二区| 欧美久久亚洲精品| 久久99精品国产麻豆| 久久乐国产精品亚洲综合| 久久久久99精品成人片试看| 久久久久九国产精品| 久久香综合精品久久伊人| 久久久WWW成人免费精品| 97久久香蕉国产线看观看| 久久丫忘忧草产品| 久久中文娱乐网| 久久精品国产亚洲AV香蕉| 欧美午夜A∨大片久久 | 一本色道久久99一综合| 国产一区二区三精品久久久无广告| 久久香综合精品久久伊人| Xx性欧美肥妇精品久久久久久 | 精品国产一区二区三区久久久狼 | 久久成人精品| 99久久国产免费福利| 国产三级久久久精品麻豆三级 | 亚洲国产精品久久久久网站| 久久亚洲私人国产精品| 亚洲天堂久久久| 色99久久久久高潮综合影院 | 综合网日日天干夜夜久久| 久久久WWW成人| 久久九九免费高清视频| 久久久国产精华液| 久久久久亚洲爆乳少妇无| 久久一区二区免费播放| 四虎久久影院| 久久精品亚洲AV久久久无码| 国产精品久久久久久久app| 伊人久久大香线蕉AV色婷婷色| 亚洲国产精品无码久久|