【玩轉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的創建

  1. void TestLayer::writeTinyXML()  
  2. {  
  3.     TiXmlDocument* myTinyXMLDoc=new TiXmlDocument();//創建文檔對象  
  4.   
  5.     TiXmlElement* rootElement=new TiXmlElement("Jacky");//創建根節點並連接到文檔  
  6.     myTinyXMLDoc->LinkEndChild(rootElement);  
  7.   
  8.     TiXmlElement* infoElement=new TiXmlElement("Info");//創建info節點並連接到根節點  
  9.     rootElement->LinkEndChild(infoElement);  
  10.   
  11.     infoElement->SetAttribute("Name","Jacky");//爲info節點設置屬性  
  12.     infoElement->SetAttribute("QQ","754505629");  
  13.     infoElement->SetAttribute("E-mail","[email protected]");  
  14.   
  15.     TiXmlElement* blogElement=new TiXmlElement("blog");  
  16.     infoElement->LinkEndChild(blogElement);//創建blog節點並連接到info節點  
  17.     TiXmlText* blogtext=new TiXmlText("http://blog.csdn.net/jackystudio");  
  18.     blogElement->LinkEndChild(blogtext);//爲blog節點添加文本值  
  19.   
  20.     TiXmlElement* websiteElenment=new TiXmlElement("website");  
  21.     infoElement->LinkEndChild(websiteElenment);  
  22.     TiXmlText* websitetext=new TiXmlText("http://www.fusijie.com");  
  23.     websiteElenment->LinkEndChild(websitetext);  
  24.   
  25.     myTinyXMLDoc->SaveFile(CCFileUtils::sharedFileUtils()->fullPathForFilename("testTiny.xml").c_str());//保存xml  
  26.   
  27.     delete myTinyXMLDoc;  
  28. }  
是不是很奇怪爲什麼new了那麼多內存,但最後只delete TixmlDocument呢?其實在TinyXML中,子節點的內存管理都由父節點進行維護,所以不必在釋放內存時對每個子節點都進行釋放,而只需要釋放父節點即可。

1.2.2.xml的讀取

  1. void TestLayer::readTinyXML()  
  2. {  
  3.     TiXmlDocument* myTinyXMLDoc=new TiXmlDocument(CCFileUtils::sharedFileUtils()->fullPathForFilename("testTiny.xml").c_str());  
  4.     myTinyXMLDoc->LoadFile();  
  5.   
  6.     TiXmlElement* rootElement = myTinyXMLDoc->RootElement();  //獲取根節點  
  7.     TiXmlElement* infoElement = rootElement->FirstChildElement();  // 獲取Info節點    
  8.   
  9.     while (infoElement)   
  10.     {  
  11.   
  12.         TiXmlAttribute* attributeOfinfo = infoElement->FirstAttribute();  //獲得info的屬性    
  13.         while ( attributeOfinfo )   
  14.         {    
  15.             CCLOG("%s : %s",attributeOfinfo->Name(),attributeOfinfo->Value());//獲取所有屬性  
  16.             attributeOfinfo = attributeOfinfo->Next();    
  17.         }  
  18.   
  19.         TiXmlElement* blogElement = infoElement->FirstChildElement();//獲得blog  
  20.         CCLOG("blog : %s",blogElement->GetText());    
  21.   
  22.         TiXmlElement* websiteElement = blogElement->NextSiblingElement();//獲取website    
  23.         CCLOG("website : %s",websiteElement->GetText());    
  24.   
  25.         infoElement = infoElement->NextSiblingElement();//查找下一節點    
  26.     }    
  27.     delete myTinyXMLDoc;    
  28. }  

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的創建

  1. void TestLayer::writeRapidXML()  
  2. {  
  3.     rapidxml::xml_document<> myRapidXMLDoc;  
  4.   
  5.     rapidxml::xml_node<>* root = myRapidXMLDoc.allocate_node(rapidxml::node_element,"Jacky",NULL);//創建根節點  
  6.     myRapidXMLDoc.append_node(root);//追加根節點  
  7.   
  8.     rapidxml::xml_node<>* info = myRapidXMLDoc.allocate_node(rapidxml::node_element,"Info",NULL);//創建info節點  
  9.     info->append_attribute(myRapidXMLDoc.allocate_attribute("Name","Jacky"));  
  10.     info->append_attribute(myRapidXMLDoc.allocate_attribute("QQ","754505629"));  
  11.     info->append_attribute(myRapidXMLDoc.allocate_attribute("E-mail","[email protected]"));  
  12.     root->append_node(info);//追加info節點到root  
  13.   
  14.     //創建blog和website節點並追加到root  
  15.     rapidxml::xml_node<>* blog = myRapidXMLDoc.allocate_node(rapidxml::node_element,"blog","http://blog.csdn.net/jackystudio");  
  16.     info->append_node(blog);  
  17.     rapidxml::xml_node<>* website = myRapidXMLDoc.allocate_node(rapidxml::node_element,"website","http://www.fusijie.com");  
  18.     info->append_node(website);  
  19.       
  20.     //保存xml文檔  
  21.     std::string text;  
  22.     rapidxml::print(std::back_inserter(text), myRapidXMLDoc, 0);  
  23.     CCLog(text.c_str());  
  24.     std::ofstream out(CCFileUtils::sharedFileUtils()->fullPathForFilename("testRapid.xml"));  
  25.     out << myRapidXMLDoc;  
  26. }  

2.2.2.xml的讀取

  1. void TestLayer::readRapidXML()  
  2. {  
  3.     rapidxml::file<> fdoc(CCFileUtils::sharedFileUtils()->fullPathForFilename("testRapid.xml").c_str());//讀取數據  
  4.     CCLog(fdoc.data());  
  5.     rapidxml::xml_document<> myRapidXMLDoc;  
  6.     myRapidXMLDoc.parse<0>(fdoc.data());//將數據寫入xml_document  
  7.   
  8.     rapidxml::xml_node<>* root = myRapidXMLDoc.first_node();//獲取根節點  
  9.   
  10.     rapidxml::xml_node<>* info = root->first_node();//獲取Info節點  
  11.   
  12.     rapidxml::xml_attribute<>* info_attr = info->first_attribute();//獲取info屬性  
  13.     CCLog("%s:%s",info_attr->name(),info_attr->value());  
  14.     CCLog("%s:%s",info_attr->next_attribute()->name(),info_attr->next_attribute()->value());  
  15.     CCLog("%s:%s",info_attr->next_attribute()->next_attribute()->name(),info_attr->next_attribute()->next_attribute()->value());  
  16.   
  17.     rapidxml::xml_node<>* blog=info->first_node();//獲取blog節點  
  18.     CCLog("%s:%s",blog->name(),blog->value());  
  19.   
  20.     rapidxml::xml_node<>* website=blog->next_sibling();//獲取website節點  
  21.     CCLog("%s:%s",website->name(),website->value());  
  22. }  

3.生成xml的文件

以上2種方式生成的xml文件內容如下:

[html] view plaincopy
  1. <Jacky>  
  2.     <Info Name="Jacky" QQ="754505629" E-mail="[email protected]">  
  3.         <blog>http://blog.csdn.net/jackystudio</blog>  
  4.         <website>http://www.fusijie.com</website>  
  5.     </Info>  
  6. </Jacky>  

4.源碼下載

下載地址:http://download.csdn.net/detail/jackyvincefu/6732361

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章