生活随笔
收集整理的這篇文章主要介紹了
【玩转cocos2d-x之三十二】xml的解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原創作品,轉載請標明:http://blog.csdn.net/jackystudio/article/details/17409381
cocos2d-x中對xml的解析是采用的TinyXML庫,而對plist的解析同時結合了CCDictionary來處理,這里簡單介紹下cocos2d-x中解析xml的兩種方式,也是常用的xml兩個C++解析庫:TinyXML和RapidXML。xml被設計用于數據存儲和傳輸,重點是數據內容本身,而不像html,用于表現數據。
1.TinyXML
1.1.概況
TinyXML的主頁是http://www.grinninglizard.com/tinyxml/,本來不打算介紹這個庫的,因為它的解析效率并不高,但是鑒于cocos2d-x采用的就是它,所以也稍微寫一下它的用法,cocos2d-x使用的是TinyXML2,Github地址在https://github.com/leethomason/tinyxml2。就是對TinyXML重新進行了封裝,具體的區別在其github上也寫的很清楚了。
1.2.示例
這里不介紹API,因為太多了,在線手冊也都有。首先下載TinyXML庫,將4個cpp文件和2個h文件加入cocos2d-x中。添加頭文件時只需添加"tinyxml.h"即可。
1.2.1.xml的創建
[cpp]?view plaincopy
void?TestLayer::writeTinyXML()?? {?? ????TiXmlDocument*?myTinyXMLDoc=new?TiXmlDocument();?? ?? ????TiXmlElement*?rootElement=new?TiXmlElement("Jacky");?? ????myTinyXMLDoc->LinkEndChild(rootElement);?? ?? ????TiXmlElement*?infoElement=new?TiXmlElement("Info");?? ????rootElement->LinkEndChild(infoElement);?? ?? ????infoElement->SetAttribute("Name","Jacky");?? ????infoElement->SetAttribute("QQ","754505629");?? ????infoElement->SetAttribute("E-mail","Geek.Jacky@Gmail.com");?? ?? ????TiXmlElement*?blogElement=new?TiXmlElement("blog");?? ????infoElement->LinkEndChild(blogElement);?? ????TiXmlText*?blogtext=new?TiXmlText("http://blog.csdn.net/jackystudio");?? ????blogElement->LinkEndChild(blogtext);?? ?? ????TiXmlElement*?websiteElenment=new?TiXmlElement("website");?? ????infoElement->LinkEndChild(websiteElenment);?? ????TiXmlText*?websitetext=new?TiXmlText("http://www.fusijie.com");?? ????websiteElenment->LinkEndChild(websitetext);?? ?? ????myTinyXMLDoc->SaveFile(CCFileUtils::sharedFileUtils()->fullPathForFilename("testTiny.xml").c_str());?? ?? ????delete?myTinyXMLDoc;?? }??
是不是很奇怪為什么new了那么多內存,但最后只delete TixmlDocument呢?其實在TinyXML中,子節點的內存管理都由父節點進行維護,所以不必在釋放內存時對每個子節點都進行釋放,而只需要釋放父節點即可。
1.2.2.xml的讀取
[cpp]?view plaincopy
void?TestLayer::readTinyXML()?? {?? ????TiXmlDocument*?myTinyXMLDoc=new?TiXmlDocument(CCFileUtils::sharedFileUtils()->fullPathForFilename("testTiny.xml").c_str());?? ????myTinyXMLDoc->LoadFile();?? ?? ????TiXmlElement*?rootElement?=?myTinyXMLDoc->RootElement();???? ????TiXmlElement*?infoElement?=?rootElement->FirstChildElement();???? ?? ????while?(infoElement)??? ????{?? ?? ????????TiXmlAttribute*?attributeOfinfo?=?infoElement->FirstAttribute();???? ????????while?(?attributeOfinfo?)??? ????????{???? ????????????CCLOG("%s?:?%s",attributeOfinfo->Name(),attributeOfinfo->Value());?? ????????????attributeOfinfo?=?attributeOfinfo->Next();???? ????????}?? ?? ????????TiXmlElement*?blogElement?=?infoElement->FirstChildElement();?? ????????CCLOG("blog?:?%s",blogElement->GetText());???? ?? ????????TiXmlElement*?websiteElement?=?blogElement->NextSiblingElement();?? ????????CCLOG("website?:?%s",websiteElement->GetText());???? ?? ????????infoElement?=?infoElement->NextSiblingElement();?? ????}???? ????delete?myTinyXMLDoc;???? }??
2.RapidXML
2.1.概況
RapidXML的主頁是http://rapidxml.sourceforge.net/。在其手冊中第四節comparison with others parsers可以看到在同等條件下它的解析效率是TinyXML的30到60倍,所以如果需要解析大文件的話,RapidXML是不二之選。
2.2.示例
首先下載RapidXML庫,將四個hpp文件都加入cocos2d-x中,在包含頭文件時,4個hpp都要進行包含。
2.2.1.xml的創建
[cpp]?view plaincopy
void?TestLayer::writeRapidXML()?? {?? ????rapidxml::xml_document<>?myRapidXMLDoc;?? ?? ????rapidxml::xml_node<>*?root?=?myRapidXMLDoc.allocate_node(rapidxml::node_element,"Jacky",NULL);?? ????myRapidXMLDoc.append_node(root);?? ?? ????rapidxml::xml_node<>*?info?=?myRapidXMLDoc.allocate_node(rapidxml::node_element,"Info",NULL);?? ????info->append_attribute(myRapidXMLDoc.allocate_attribute("Name","Jacky"));?? ????info->append_attribute(myRapidXMLDoc.allocate_attribute("QQ","754505629"));?? ????info->append_attribute(myRapidXMLDoc.allocate_attribute("E-mail","Geek.Jacky@Gmail.com"));?? ????root->append_node(info);?? ?? ?????? ????rapidxml::xml_node<>*?blog?=?myRapidXMLDoc.allocate_node(rapidxml::node_element,"blog","http://blog.csdn.net/jackystudio");?? ????info->append_node(blog);?? ????rapidxml::xml_node<>*?website?=?myRapidXMLDoc.allocate_node(rapidxml::node_element,"website","http://www.fusijie.com");?? ????info->append_node(website);?? ?????? ?????? ????std::string?text;?? ????rapidxml::print(std::back_inserter(text),?myRapidXMLDoc,?0);?? ????CCLog(text.c_str());?? ????std::ofstream?out(CCFileUtils::sharedFileUtils()->fullPathForFilename("testRapid.xml"));?? ????out?<<?myRapidXMLDoc;?? }??
2.2.2.xml的讀取
[cpp]?view plaincopy
void?TestLayer::readRapidXML()?? {?? ????rapidxml::file<>?fdoc(CCFileUtils::sharedFileUtils()->fullPathForFilename("testRapid.xml").c_str());?? ????CCLog(fdoc.data());?? ????rapidxml::xml_document<>?myRapidXMLDoc;?? ????myRapidXMLDoc.parse<0>(fdoc.data());?? ?? ????rapidxml::xml_node<>*?root?=?myRapidXMLDoc.first_node();?? ?? ????rapidxml::xml_node<>*?info?=?root->first_node();?? ?? ????rapidxml::xml_attribute<>*?info_attr?=?info->first_attribute();?? ????CCLog("%s:%s",info_attr->name(),info_attr->value());?? ????CCLog("%s:%s",info_attr->next_attribute()->name(),info_attr->next_attribute()->value());?? ????CCLog("%s:%s",info_attr->next_attribute()->next_attribute()->name(),info_attr->next_attribute()->next_attribute()->value());?? ?? ????rapidxml::xml_node<>*?blog=info->first_node();?? ????CCLog("%s:%s",blog->name(),blog->value());?? ?? ????rapidxml::xml_node<>*?website=blog->next_sibling();?? ????CCLog("%s:%s",website->name(),website->value());?? }??
3.生成xml的文件
以上2種方式生成的xml文件內容如下:
[html]?view plaincopy
<Jacky>?? ????<Info?Name="Jacky"?QQ="754505629"?E-mail="Geek.Jacky@Gmail.com">?? ????????<blog>http://blog.csdn.net/jackystudio</blog>?? ????????<website>http://www.fusijie.com</website>?? ????</Info>?? </Jacky>??
4.源碼下載
下載地址:http://download.csdn.net/detail/jackyvincefu/6732361
總結
以上是生活随笔為你收集整理的【玩转cocos2d-x之三十二】xml的解析的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。