在前面看到怎么打開
XML文件,在那個(gè)函數(shù)的后面調(diào)用parseBuffer函數(shù)來分析XML數(shù)據(jù),那么在這個(gè)函數(shù)是怎么樣進(jìn)行XML數(shù)據(jù)分析的呢?現(xiàn)在就仔細(xì)地分析這個(gè)函數(shù)的代碼,它的代碼如下:
#001?// static
#002?bool LLXMLNode::parseBuffer(
#003?
?? U8* buffer,
#004?
?? U32 length,
#005?
?? LLXMLNodePtr& node,
#006?
?? LLXMLNode* defaults)
#007?{
?
調(diào)用
expat庫函數(shù)XML_ParserCreate來創(chuàng)建一個(gè)分析器。
#008?
?? // Init
#009?
?? XML_Parser my_parser = XML_ParserCreate(NULL);
?
設(shè)置
XML元素的開始函數(shù)StartXMLNode和結(jié)束函數(shù)EndXMLNode。
#010?
?? XML_SetElementHandler(my_parser, StartXMLNode, EndXMLNode);
?
設(shè)置不同的字符處理函數(shù)
XMLData。
#011?
?? XML_SetCharacterDataHandler(my_parser, XMLData);
#012?
?
開始創(chuàng)建一個(gè)
XML節(jié)點(diǎn)。
#013?
?? // Create a root node
#014?
?? LLXMLNode *file_node_ptr = new LLXMLNode("XML", FALSE);
#015?
?? LLXMLNodePtr file_node = file_node_ptr;
#016?
?
保存這個(gè)節(jié)點(diǎn)的分析器。
#017?
?? file_node->mParser = &my_parser;
#018?
?
設(shè)置傳送給回調(diào)函數(shù)的數(shù)據(jù)。
#019?
?? XML_SetUserData(my_parser, (void *)file_node_ptr);
#020?
?
調(diào)用
XML_Parse函數(shù)進(jìn)行XML文件分析。
#021?
?? // Do the parsing
#022?
?? if (XML_Parse(my_parser, (const char *)buffer, length, TRUE) != XML_STATUS_OK)
#023?
?? {
#024?
?????? llwarns << "Error parsing xml error code: "
#025?
?????????????? << XML_ErrorString(XML_GetErrorCode(my_parser))
#026?
?????????????? << " on lne " << XML_GetCurrentLineNumber(my_parser)
#027?
?????????????? << llendl;
#028?
?? }
#029?
?
XML文件分析完成,然后刪除創(chuàng)建的
XML分析器。
#030?
?? // Deinit
#031?
?? XML_ParserFree(my_parser);
#032?
?
?
分析
XML失敗,沒有任何數(shù)據(jù)。
#033?
?? if (!file_node->mChildren || file_node->mChildren->map.size() != 1)
#034?
?? {
#035?
?????? llwarns << "Parse failure - wrong number of top-level nodes xml."
#036?
?????????????? << llendl;
#037?
?????? node = new LLXMLNode();
#038?
?????? return false;
#039?
?? }
#040?
?
返回已經(jīng)分析好的
XML節(jié)點(diǎn)樹。
#041?
?? LLXMLNode *return_node = file_node->mChildren->map.begin()->second;
#042?
#043?
?? return_node->setDefault(defaults);
#044?
?? return_node->updateDefault();
#045?
#046?
?? node = return_node;
#047?
?? return true;
#048?}
?
從這個(gè)函數(shù)的代碼里看到,跟前面介紹的
expat例子是一樣的,調(diào)用庫函數(shù)XML_ParserCreate、XML_SetElementHandler、XML_Parse等三個(gè)函數(shù)就完成了XML的分析過程,只不過這里會把所有分析到的XML數(shù)據(jù)生成一棵樹返回來。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
