青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

積木

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://www.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)的樹(shù)結(jié)構(gòu),同時(shí),向用戶提供一系列的接口來(lái)訪問(wèn)和編輯該樹(shù)結(jié)構(gòu)。這種方式占用內(nèi)存大,速度往往慢于 SAX ,但可以給用戶提供一個(gè)面向?qū)ο蟮脑L問(wèn)接口,對(duì)用戶更為友好。

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

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

名稱

訪問(wèn)接口

是否支持驗(yàn)證

備注

Expat

SAX/Local

不清楚

Local 指它還有一套自己訪問(wèn)模型

LibXML2

SAX/DOM

 

TinyXml

DOM

 

XML4C

SAX/DOM

 Xerces-C 是一家,不過(guò)用了 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 文件來(lái)定義,符合了這些定義要求的 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)該打開(kāi)這個(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 的,可以通過(guò)編輯 Makefile  TINYXML_USE_STL := NO 那一行,把 NO 改成 YES 就可以支持 STL 了;還有默認(rèn)只生成了一個(gè)測(cè)試程序,沒(méi)有生成任何庫(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 訪問(wèn)模型,因此提供了一系列的類對(duì)應(yīng) XML 文件中的各個(gè)節(jié)點(diǎn)。主要類間的關(guān)系如下圖所示:

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

TiXmlNode :表示一個(gè)節(jié)點(diǎn),包含節(jié)點(diǎn)的一般方法,如訪問(wè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.      需要注意的問(wèn)題

各類之間的轉(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)存訪問(wèn)的錯(cuò)誤。

 

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

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

 

四、      總結(jié)

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

posted on 2012-02-14 17:40 Jacc.Kim 閱讀(369) 評(píng)論(0)  編輯 收藏 引用 所屬分類: VC / C++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩成人在线播放| 日韩视频一区二区三区在线播放| 看片网站欧美日韩| 亚洲性图久久| 亚洲第一伊人| 久久久亚洲成人| 亚洲欧美不卡| 亚洲视频一区| 99国产精品久久久久久久| 精品成人在线视频| 国产欧美日韩麻豆91| 欧美性大战久久久久| 欧美精品在线一区| 欧美jizz19性欧美| 久久久久久高潮国产精品视| 亚洲一二三区在线| 一本久道久久久| 亚洲美女91| 亚洲激情一区二区三区| 欧美激情视频一区二区三区在线播放 | 亚洲桃色在线一区| 日韩天堂在线观看| 日韩视频―中文字幕| 91久久精品久久国产性色也91| 蜜桃av一区| 欧美福利一区| 欧美福利视频在线| 亚洲电影在线看| 亚洲国产日韩一区| 91久久在线| 亚洲裸体俱乐部裸体舞表演av| 亚洲欧洲一区二区天堂久久 | 欧美日韩在线一区| 欧美日韩一区二区三区| 欧美日韩一区在线| 国产精品久久久久久久久久久久 | 香蕉久久夜色精品| 欧美在线首页| 久久综合给合久久狠狠色| 亚洲黄网站黄| 亚洲精品国产精品国自产观看浪潮| 亚洲激情国产| 99视频精品全部免费在线| 亚洲午夜女主播在线直播| 亚洲欧美精品在线观看| 久久黄色级2电影| 玖玖精品视频| 午夜欧美大尺度福利影院在线看| 香蕉久久久久久久av网站| 久久精品视频在线播放| 欧美成人亚洲成人| 亚洲人成欧美中文字幕| 中文在线资源观看视频网站免费不卡| 中文日韩电影网站| 欧美在线视频网站| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美精品高清视频| 国产精品推荐精品| 在线成人h网| 国产精品99久久不卡二区| 校园春色综合网| 你懂的国产精品永久在线| 亚洲精品在线观看免费| 亚洲一区日韩在线| 久久综合九色综合欧美狠狠| 欧美精彩视频一区二区三区| 国产精品尤物福利片在线观看| 在线观看成人av| 亚洲永久免费av| 久久综合狠狠综合久久综青草 | 亚洲国产日韩欧美在线99| 一本久久综合亚洲鲁鲁| 久久精品人人做人人爽电影蜜月| 欧美电影在线| 亚洲欧洲av一区二区| 欧美国产精品久久| 国产喷白浆一区二区三区| 亚洲人成啪啪网站| 久久激情综合| 99国产精品私拍| 久久久精品网| 国产精品男gay被猛男狂揉视频| 在线播放中文一区| 亚洲欧美文学| 亚洲国产另类精品专区| 欧美一级精品大片| 欧美视频第二页| 亚洲激情校园春色| 久久精品午夜| 一区二区三区产品免费精品久久75| 久久久蜜桃精品 | 99精品欧美一区二区三区| 久久精品一区二区三区不卡| 99re6这里只有精品视频在线观看| 久久爱www久久做| 欧美性色综合| 亚洲狼人综合| 免费成人你懂的| 性视频1819p久久| 国产精品高潮粉嫩av| 91久久综合亚洲鲁鲁五月天| 久久精品一区| 亚洲欧美美女| 国产精品久久久久9999| 洋洋av久久久久久久一区| 欧美a级一区二区| 久久精品二区亚洲w码| 国产精品久久久久久久久婷婷| 亚洲乱码国产乱码精品精98午夜| 久久女同精品一区二区| 亚洲欧美另类在线| 国产精品乱看| 亚洲男女毛片无遮挡| 日韩午夜免费| 欧美日韩www| 一区二区免费在线播放| 亚洲国产精品久久久久婷婷884| 久久久久久久久久看片| 国产一区视频网站| 久久精品一本| 久久av资源网站| 国产在线欧美| 久久视频精品在线| 久久er99精品| 激情婷婷亚洲| 欧美jizzhd精品欧美喷水 | 一本色道88久久加勒比精品| 亚洲国产精品一区二区www| 免费观看成人www动漫视频| 亚洲国产成人一区| 亚洲国产成人精品视频| 欧美国产日韩在线| 一区二区三区欧美成人| 99视频精品免费观看| 欧美性大战久久久久久久蜜臀| 亚洲女优在线| 欧美一二三区在线观看| 黄色日韩在线| 欧美aa国产视频| 欧美粗暴jizz性欧美20| 一区二区高清视频| 亚洲永久精品大片| 国产日韩一区二区三区在线| 久久久噜噜噜久久狠狠50岁| 久久免费午夜影院| 亚洲精品影视| 中日韩视频在线观看| 国产精品综合久久久| 麻豆精品精华液| 欧美激情精品久久久久久蜜臀| 一区二区三区视频在线观看| 亚洲夜间福利| 黄色成人在线网址| 亚洲激情综合| 国产精品色网| 久久资源在线| 欧美人与禽猛交乱配视频| 亚洲欧美在线一区二区| 久久精品视频在线| 亚洲伦理在线| 亚洲免费影视| 亚洲国产高清自拍| 一本在线高清不卡dvd| 国产一二三精品| 最新日韩av| 国产麻豆成人精品| 欧美激情一二区| 国产精品婷婷午夜在线观看| 欧美电影免费观看| 国产精品日韩欧美一区二区| 久久亚洲春色中文字幕久久久| 欧美国产日本在线| 久久九九精品| 欧美色欧美亚洲高清在线视频| 久久久国产精品一区| 欧美人成在线视频| 久久露脸国产精品| 欧美日韩一区二区三区在线看| 久久婷婷色综合| 欧美色播在线播放| 欧美黄色小视频| 国产精品一二三视频| 亚洲国产三级网| 国产综合色在线视频区| 亚洲看片免费| 亚洲国产老妈| 亚洲欧美日韩国产成人| 一区二区91| 免费在线成人av| 久久青草久久| 国产精品视频免费观看| 亚洲国产欧美不卡在线观看| 国产一区二区三区观看| 在线视频欧美一区| 99re8这里有精品热视频免费| 欧美综合国产| 香蕉久久久久久久av网站| 欧美精品一区二区三| 欧美成va人片在线观看| 国产亚洲午夜|