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

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
數(shù)據(jù)加載中……

用YACC提高XML在C++中的解析性能

在C++中,解析XML文件通常需要使用XML的解析類或庫(kù),如DOM(DOCUMENT OBJECT MODEL)或SAX(SIMPLE API FOR XML),來(lái)解析XML文件,從而得到所需的數(shù)據(jù)。雖然比較方便,但是這種方法的效率不是很高,而把XML解析為C++的類,不但能提高解析的效率,而且還能提供給用戶面向?qū)ο蟮乃袃?yōu)點(diǎn)。

一. 通常用DOMSAX解析XML文件所帶來(lái)的問(wèn)題

C++的程序在處理XML文件時(shí)常常會(huì)碰到解析的問(wèn)題,有時(shí)需要根據(jù)一定的規(guī)則自己寫一個(gè)解析的類或包。因此,使用DOM或SAX來(lái)解析XML文件就顯得相對(duì)比較簡(jiǎn)單。但是解析XML文件,一個(gè)非常重要的問(wèn)題,即對(duì)于一些不同的語(yǔ)言,如JAVA,C++,XML沒(méi)有一個(gè)固定的標(biāo)簽(如關(guān)鍵字),因此,開(kāi)發(fā)一個(gè)適合于多種語(yǔ)言的通用解析器就顯得非常由必要。

為了解決這個(gè)問(wèn)題,開(kāi)發(fā)出的這個(gè)解析器要能動(dòng)態(tài)的列出標(biāo)簽和解析XML文件的規(guī)則。即對(duì)于一個(gè)DOM的解析器要確定一個(gè)XML的模式文件,從而可以對(duì)XML文件中的內(nèi)容進(jìn)行有效性的確認(rèn)。

如果一個(gè)應(yīng)用程序需要對(duì)XML文件進(jìn)行不同的讀寫操作,DOM這個(gè)解析模式是非常合適的。因?yàn)樗鼘?duì)于不同的XM文件,它的源代碼都不需要改變。但是,引用程序?qū)ML文件的操作由可能進(jìn)行的比較少,在這種情況下,如果使用DOM解析器解析XML文件,就加重程序的負(fù)擔(dān)。因此,根據(jù)不同的情況來(lái)選擇不同的解析器,使非常有必要的。而且有時(shí)還需自己開(kāi)發(fā)出一個(gè)合適的解析器。

二. XML模式(SCHEMAS)中派生出的靜態(tài)類

和在某些情況下可以從XML模式中派生出C++類,對(duì)XML文件進(jìn)行寫操作,提高程

序的效率一樣,也可以從XML模式中派生出C++類,對(duì)XML文件進(jìn)行解析,即讀操作。

在C++中,為了生成某個(gè)語(yǔ)言的解析類,通常需要如下的步驟:首先需要編寫LEX規(guī)則或YACC語(yǔ)法的代碼,然后在根據(jù)特定的XML輸入文件生成LEXER和解析類。如下圖一所示:

clip_image001[3]

但是,這個(gè)過(guò)程非常繁瑣,而且對(duì)于每個(gè)不同的XML文件形式,都需要重復(fù)進(jìn)行如下的步上的步驟。一個(gè)更有效的做法是先編寫一個(gè)用作翻譯的程序,把XML模式文件轉(zhuǎn)化為相對(duì)應(yīng)的LEX規(guī)則或YACC語(yǔ)法,如下圖二所示:

clip_image002[3]

下面的程序(程序一)說(shuō)明了對(duì)于一個(gè)XML的DTD文件ACMEPC.DTD所生成的語(yǔ)法。

acmepcxml::XMLImporter importer;

// Call the acmepcxml::Initialize() function to register the create functions

// for the acmepcxml classes

acmepcxml::Initialize();

try {

importer.ImportFromFile(sInputFileName, fPreprocess);

}

catch (eXactML::XException & e)

{

std::cerr << e.GetMsg() << std::endl;

std::cerr << "in " << e.GetSourceFile() << " at line number " <<

e.GetSourceLine() << std::endl;

return 1;

}

cout << "Read in XML file with no errors." << std::endl;

acmepc *acmepc = dynamic_cast (importer.GetXObject());

cout << "Successfully cast XML importer root to acmepcxml::acmepc" << std::endl;

// validate the data in the classes, throws an exception if bad.

try {

acmepc->IsValid();

}

catch (eXactML::XException & e) {

cout << "Exception in validating XML" << std::endl;

cout << e.GetMsg() << std::endl;

eXactML::XMLImporterBase::DeleteImportedXObject(acmepc);

return 1;

}

cout << "Validated acmepcxml::acmepc object" << std::endl;

// generate the XML

try {

acmepc->EmitXML(cout);

}

catch (eXactML::XException e) {

cout << "Exception in generating XML" << std::endl;

cout << e.GetMsg() << std::endl;

eXactML::XMLImporterBase::DeleteImportedXObject(acmepc);

return 1;

}

cout << "Emitted XML to file worked fine." << std::endl;

eXactML::XMLImporterBase::DeleteImportedXObject(acmepc);

return 0;

程序一

type CDATA #REQUIRED

speed CDATA #REQUIRED>

type (IDE|EIDE|SCSI) "IDE"

size CDATA #REQUIRED

units (GB|TB) "GB">

n CDATA #REQUIRED

units CDATA #REQUIRED>

n CDATA #REQUIRED

units CDATA #REQUIRED>

ACMEPC.DTD文件

在ACMEPCXML_PARSER.Y中生成的YACC輸入和在ACMEPCXML_LEXER.L中生成的LEX輸入。所有的這些類和解析器都包含在C++中的ACMEPCXML的名字空間中。

使用這個(gè)生成的通用解析器非常簡(jiǎn)單,只需生成類ACMEPCXML::XMLIMPORTER的一個(gè)實(shí)例,然后調(diào)用類中的Initiliaze()這個(gè)初始化的成員函數(shù),在把XML文件傳給ImportFromFile()這個(gè)程序函數(shù)。這個(gè)引入的類通過(guò)GetXObject()來(lái)發(fā)布這個(gè)樹(shù)形的根結(jié)點(diǎn)。這個(gè)基本的類在動(dòng)態(tài)的返回給在ACMEPC.DTD文件中定義的XML上下文的ACMPEPC類。

三. 生成的通用解析類的優(yōu)點(diǎn)

同一些其它的標(biāo)準(zhǔn)解析器或類相比,如DOM,SAX,自己生成的通用解析類主要由如下的幾個(gè)特點(diǎn)和優(yōu)點(diǎn)。

1. 最根本也是最重要的─解析的速度快。經(jīng)過(guò)測(cè)試,根據(jù)XML模式生成的通用解析器,要比最快的DOM解析器速度要快三倍以上,而且內(nèi)存的占用也很少。這主要是因?yàn)閷?duì)于XML文件的輸入不需要經(jīng)過(guò)有效性的檢查和判斷。這個(gè)工作早在由輸入文件生成YACC時(shí),就已經(jīng)做好和強(qiáng)制性的檢查。

2. 生成的通用解析器能和其它的派生類非常好的結(jié)合在一起。而且不用象使用DOM一樣,生成一個(gè)DOM的數(shù)形結(jié)構(gòu),然后在對(duì)這些數(shù)據(jù)進(jìn)行操作。通用解析器能直接的生成XML模式的派生類,這樣就省去了中間的步驟。當(dāng)然,該解析類也能很好的和STL或MFC的類庫(kù)結(jié)合在一起

3. 你能得到鏈接到你應(yīng)用程序組件的所用源代碼。只要嚴(yán)格遵循符合GNU規(guī)范的FLEX和BISON工具的使用,生成的代碼就能夠在任何的操作系統(tǒng)上運(yùn)行,從而很好的解決了跨平臺(tái)的問(wèn)題。

4. 最后也是最令人激動(dòng)的一個(gè)優(yōu)點(diǎn)是使用LEX和YACC可以方便的來(lái)操作和處理XML文件中的實(shí)體元素(ENTITY)。你可以在輸入文件中自動(dòng)擴(kuò)展實(shí)體的數(shù)量。XML中的實(shí)體也可以如C程序中的宏定義一樣,是C編譯器提前預(yù)處理。當(dāng)你要處理大量的實(shí)體元素是,將非常有效。

四. 總結(jié)

由XML模式(SCHEMA)生成C++的類,作為解析器來(lái)解析XML的輸入文件是件非常令人激動(dòng)的事,它不但能減少重復(fù)的編碼,更能提高你的效率。在不久的將來(lái)該項(xiàng)技術(shù)將會(huì)由長(zhǎng)足的發(fā)展。

五. 附該程序的所有源代碼(包括C++的類和DTD文件,XML文件

xmlparser.zip

posted on 2008-11-22 14:27 肥仔 閱讀(1399) 評(píng)論(1)  編輯 收藏 引用 所屬分類: XMLLEX & YACC

評(píng)論

# re: 用YACC提高XML在C++中的解析性能  回復(fù)  更多評(píng)論   

少文件呢??
2009-02-05 15:11 | ww

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久av一区二区三区| 欧美成年网站| 欧美国产日产韩国视频| 欧美中文字幕| 久久视频在线看| 久久乐国产精品| 久久综合一区| 亚洲激情成人网| 亚洲成在人线av| 欧美日韩福利视频| 亚洲日本va在线观看| 亚洲国产精品成人精品| 欧美激情免费观看| 亚洲精品综合精品自拍| 一区二区三区高清不卡| 欧美成人性网| 亚洲精品午夜精品| 亚洲午夜久久久| 久久精品亚洲乱码伦伦中文| 卡一卡二国产精品| 欧美日韩一区二区三区免费看| 亚洲男人第一av网站| 欧美日韩在线播放| 久久国产精品99精品国产| 麻豆成人小视频| 欧美午夜在线| 在线观看精品| 午夜精品久久久久久99热软件 | 欧美激情1区2区3区| 欧美三级日韩三级国产三级| 国产亚洲成av人在线观看导航| 在线观看三级视频欧美| 亚洲直播在线一区| 亚洲国产高潮在线观看| 亚洲摸下面视频| 欧美精选午夜久久久乱码6080| 国产精品一区视频网站| 亚洲精品美女久久7777777| 欧美一区高清| 日韩视频免费在线| 久久三级福利| 国内一区二区三区在线视频| 亚洲视频 欧洲视频| 欧美成人影音| 久久国产精品色婷婷| 国产精品久久久久77777| 亚洲日韩第九十九页| 久久三级福利| 亚洲欧美在线免费| 欧美视频日韩视频| 亚洲精品麻豆| 欧美成人亚洲| 另类成人小视频在线| 国产欧美日韩精品a在线观看| 夜夜精品视频| 亚洲精品少妇| 模特精品在线| 91久久一区二区| 欧美成人午夜77777| 久久综合狠狠综合久久激情| 国产有码在线一区二区视频| 性18欧美另类| 亚洲男同1069视频| 欧美午夜寂寞影院| 亚洲一区二区三区欧美| 99精品欧美一区二区蜜桃免费| 你懂的网址国产 欧美| 一区二区三区在线不卡| 久久另类ts人妖一区二区| 性娇小13――14欧美| 国产麻豆综合| 久久久综合网站| 久久青草福利网站| 在线看日韩av| 亚洲精品在线一区二区| 欧美成人免费视频| 久久中文字幕导航| 久久尤物视频| 99视频在线精品国自产拍免费观看| 亚洲专区在线视频| 欧美一区综合| 亚洲电影免费在线观看| 欧美黄色日本| 欧美另类专区| 亚洲欧美日韩国产精品| 亚洲第一页中文字幕| 亚洲欧洲日本国产| 欧美亚洲成人精品| 亚洲精品系列| 亚洲一二三四区| 激情av一区二区| 最近看过的日韩成人| 欧美色精品天天在线观看视频| 亚洲欧美日韩视频二区| 欧美一区二区国产| 亚洲人午夜精品| 亚洲一区二区免费视频| 国产在线乱码一区二区三区| 亚洲无线观看| 久久精品视频在线看| 99天天综合性| 欧美综合二区| 一区二区三区国产在线| 久久成人一区二区| 亚洲视频999| 久久亚洲二区| 新片速递亚洲合集欧美合集| 久久精品国产精品亚洲综合| av成人天堂| 久久国产精品久久国产精品| 一区二区三区免费网站| 久久免费视频在线观看| 亚洲一级影院| 欧美成年人视频| 久久伊人一区二区| 欧美三级免费| 亚洲高清三级视频| 韩国成人理伦片免费播放| 国产精品99久久久久久久女警| 久久夜色精品国产欧美乱极品| 亚洲美女免费精品视频在线观看| 亚洲一级一区| 一区二区三区 在线观看视频| 久久精品国产亚洲一区二区| 亚洲一区二区欧美日韩| 男人的天堂成人在线| 久久嫩草精品久久久精品一| 国产精品福利av| 亚洲免费不卡| 日韩一级精品视频在线观看| 久久免费偷拍视频| 久久精品亚洲精品| 国产欧美日韩在线视频| 亚洲网在线观看| 在线中文字幕一区| 欧美日韩国产一级片| 亚洲欧洲精品天堂一级| 亚洲精品乱码久久久久久蜜桃91| 一区二区三区视频观看| 国产三级精品三级| 亚洲午夜久久久久久久久电影院| 最新国产の精品合集bt伙计| 日韩亚洲欧美成人| 国产精品扒开腿做爽爽爽视频 | 国产情人综合久久777777| 一区二区三区免费看| 亚洲图色在线| 国产精品福利影院| 久久久.com| 激情文学综合丁香| 久久久久国色av免费观看性色| 久久精品视频在线播放| 国产一区自拍视频| 久久久视频精品| 欧美激情精品久久久六区热门 | 久久亚洲综合| 亚洲欧洲精品一区二区三区波多野1战4 | 99国产精品国产精品毛片| 欧美日产国产成人免费图片| 亚洲一级高清| 久久久.com| 一区二区三区四区五区精品视频 | 久久综合狠狠综合久久激情| 激情校园亚洲| 欧美日韩国产成人在线免费| 午夜激情亚洲| 亚洲激情影院| 性久久久久久| 亚洲国产综合91精品麻豆| 欧美性猛交视频| 久久精品综合一区| 99精品免费视频| 老司机一区二区三区| 99精品欧美一区二区蜜桃免费| 国产精品免费视频xxxx| 快she精品国产999| 亚洲一二区在线| 欧美激情中文字幕乱码免费| 亚洲图片欧洲图片av| 一区二区在线不卡| 国产精品久久毛片a| 久久综合久久美利坚合众国| 亚洲精品1234| 欧美主播一区二区三区美女 久久精品人| 国产综合自拍| 欧美日韩成人一区| 欧美与欧洲交xxxx免费观看| 亚洲片在线观看| 久久精品成人欧美大片古装| 欧美日产国产成人免费图片| 一区二区激情小说| 久久亚洲精品中文字幕冲田杏梨| 亚洲国产你懂的| 国产精品日本一区二区| 美女国内精品自产拍在线播放| 日韩特黄影片| 免费视频最近日韩| 欧美日韩国产va另类| 亚洲网站在线| 久久精品国产第一区二区三区|