原創作品,轉載請標明: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的創建
- void TestLayer::writeTinyXML()
- {
- TiXmlDocument* myTinyXMLDoc=new TiXmlDocument();//創建文檔對象
- TiXmlElement* rootElement=new TiXmlElement("Jacky");//創建根節點並連接到文檔
- myTinyXMLDoc->LinkEndChild(rootElement);
- TiXmlElement* infoElement=new TiXmlElement("Info");//創建info節點並連接到根節點
- rootElement->LinkEndChild(infoElement);
- infoElement->SetAttribute("Name","Jacky");//爲info節點設置屬性
- infoElement->SetAttribute("QQ","754505629");
- infoElement->SetAttribute("E-mail","[email protected]");
- TiXmlElement* blogElement=new TiXmlElement("blog");
- infoElement->LinkEndChild(blogElement);//創建blog節點並連接到info節點
- TiXmlText* blogtext=new TiXmlText("http://blog.csdn.net/jackystudio");
- blogElement->LinkEndChild(blogtext);//爲blog節點添加文本值
- 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());//保存xml
- delete myTinyXMLDoc;
- }
1.2.2.xml的讀取
- void TestLayer::readTinyXML()
- {
- TiXmlDocument* myTinyXMLDoc=new TiXmlDocument(CCFileUtils::sharedFileUtils()->fullPathForFilename("testTiny.xml").c_str());
- myTinyXMLDoc->LoadFile();
- TiXmlElement* rootElement = myTinyXMLDoc->RootElement(); //獲取根節點
- TiXmlElement* infoElement = rootElement->FirstChildElement(); // 獲取Info節點
- while (infoElement)
- {
- TiXmlAttribute* attributeOfinfo = infoElement->FirstAttribute(); //獲得info的屬性
- while ( attributeOfinfo )
- {
- CCLOG("%s : %s",attributeOfinfo->Name(),attributeOfinfo->Value());//獲取所有屬性
- attributeOfinfo = attributeOfinfo->Next();
- }
- TiXmlElement* blogElement = infoElement->FirstChildElement();//獲得blog
- CCLOG("blog : %s",blogElement->GetText());
- TiXmlElement* websiteElement = blogElement->NextSiblingElement();//獲取website
- 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的創建
- 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節點
- info->append_attribute(myRapidXMLDoc.allocate_attribute("Name","Jacky"));
- info->append_attribute(myRapidXMLDoc.allocate_attribute("QQ","754505629"));
- info->append_attribute(myRapidXMLDoc.allocate_attribute("E-mail","[email protected]"));
- root->append_node(info);//追加info節點到root
- //創建blog和website節點並追加到root
- 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);
- //保存xml文檔
- 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的讀取
- 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());//將數據寫入xml_document
- rapidxml::xml_node<>* root = myRapidXMLDoc.first_node();//獲取根節點
- rapidxml::xml_node<>* info = root->first_node();//獲取Info節點
- rapidxml::xml_attribute<>* info_attr = info->first_attribute();//獲取info屬性
- 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();//獲取blog節點
- CCLog("%s:%s",blog->name(),blog->value());
- rapidxml::xml_node<>* website=blog->next_sibling();//獲取website節點
- CCLog("%s:%s",website->name(),website->value());
- }
3.生成xml的文件
以上2種方式生成的xml文件內容如下:
- <Jacky>
- <Info Name="Jacky" QQ="754505629" E-mail="[email protected]">
- <blog>http://blog.csdn.net/jackystudio</blog>
- <website>http://www.fusijie.com</website>
- </Info>
- </Jacky>
4.源碼下載