微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【玩转cocos2d-x之三十二】xml的解析

原创作品,转载请标明http://www.jb51.cc/article/p-dpestbvf-ep.html


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. voidTestLayer::writeTinyXML()
  2. {
  3. tixmlDocument*myTinyXMLDoc=newtixmlDocument();//创建文档对象
  4. tixmlElement*rootElement=newtixmlElement("Jacky");//创建根节点并连接到文档
  5. myTinyXMLDoc->LinkEndChild(rootElement);
  6. tixmlElement*infoElement=newtixmlElement("Info");//创建info节点并连接到根节点
  7. rootElement->LinkEndChild(infoElement);
  8. infoElement->SetAttribute("Name","Jacky");//为info节点设置属性
  9. infoElement->SetAttribute("QQ","754505629");
  10. infoElement->SetAttribute("E-mail","Geek.Jacky@Gmail.com");
  11. tixmlElement*blogElement=newtixmlElement("blog");
  12. infoElement->LinkEndChild(blogElement);//创建blog节点并连接到info节点
  13. tixmlText*blogtext=newtixmlText("http://blog.csdn.net/jackystudio");
  14. blogElement->LinkEndChild(blogtext);//为blog节点添加文本值
  15. tixmlElement*websiteElenment=newtixmlElement("website");
  16. infoElement->LinkEndChild(websiteElenment);
  17. tixmlText*websitetext=newtixmlText("http://www.fusijie.com");
  18. websiteElenment->LinkEndChild(websitetext);
  19. myTinyXMLDoc->SaveFile(CCFileUtils::sharedFileUtils()->fullPathForFilename("testTiny.xml").c_str());//保存xml
  20. deletemyTinyXMLDoc;
  21. }
是不是很奇怪为什么new了那么多内存,但最后只delete tixmlDocument呢?其实在TinyXML中,子节点的内存管理都由父节点进行维护,所以不必在释放内存时对每个子节点都进行释放,而只需要释放父节点即可。

1.2.2.xml的读取

copy
    voidTestLayer::readTinyXML()
  1. newtixmlDocument(CCFileUtils::sharedFileUtils()->fullPathForFilename("testTiny.xml").c_str());
  2. myTinyXMLDoc->LoadFile();
  3. tixmlElement*rootElement=myTinyXMLDoc->RootElement();//获取根节点
  4. tixmlElement*infoElement=rootElement->FirstChildElement();//获取Info节点
  5. while(infoElement)
  6. tixmlAttribute*attributeOfinfo=infoElement->FirstAttribute();//获得info的属性
  7. while(attributeOfinfo)
  8. cclOG("%s:%s",attributeOfinfo->Name(),attributeOfinfo->Value());//获取所有属性
  9. attributeOfinfo=attributeOfinfo->Next();
  10. }
  11. tixmlElement*blogElement=infoElement->FirstChildElement();//获得blog
  12. cclOG("blog:%s",blogElement->GetText());
  13. tixmlElement*websiteElement=blogElement->NextSiblingElement();//获取website
  14. cclOG("website:%s",websiteElement->GetText());
  15. infoElement=infoElement->NextSiblingElement();//查找下一节点
  16. }
  17. }

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

copy
    voidTestLayer::writerapidXML()
  1. rapidxml::xml_document<>myRapidXMLDoc;
  2. rapidxml::xml_node<>*root=myRapidXMLDoc.allocate_node(rapidxml::node_element,"Jacky",NULL);//创建根节点
  3. myRapidXMLDoc.append_node(root);//追加根节点
  4. rapidxml::xml_node<>*info=myRapidXMLDoc.allocate_node(rapidxml::node_element,"Info",0); background-color:inherit">//创建info节点
  5. info->append_attribute(myRapidXMLDoc.allocate_attribute("Name","Jacky"));
  6. info->append_attribute(myRapidXMLDoc.allocate_attribute("QQ","754505629"));
  7. info->append_attribute(myRapidXMLDoc.allocate_attribute("E-mail","Geek.Jacky@Gmail.com"));
  8. root->append_node(info);//追加info节点到root
  9. //创建blog和website节点并追加到root
  10. rapidxml::xml_node<>*blog=myRapidXMLDoc.allocate_node(rapidxml::node_element,"blog","http://blog.csdn.net/jackystudio");
  11. info->append_node(blog);
  12. rapidxml::xml_node<>*website=myRapidXMLDoc.allocate_node(rapidxml::node_element,"website","http://www.fusijie.com");
  13. info->append_node(website);
  14. //保存xml文档
  15. std::stringtext;
  16. rapidxml::print(std::back_inserter(text),myRapidXMLDoc,0);
  17. cclog(text.c_str());
  18. std::ofstreamout(CCFileUtils::sharedFileUtils()->fullPathForFilename("testRapid.xml"));
  19. out<<myRapidXMLDoc;
  20. }

2.2.2.xml的读取

copy
    voidTestLayer::readRapidXML()
  1. rapidxml::file<>fdoc(CCFileUtils::sharedFileUtils()->fullPathForFilename("testRapid.xml").c_str());//读取数据
  2. cclog(fdoc.data());
  3. myRapidXMLDoc.parse<0>(fdoc.data());//将数据写入xml_document
  4. rapidxml::xml_node<>*root=myRapidXMLDoc.first_node(); rapidxml::xml_node<>*info=root->first_node();//获取Info节点
  5. rapidxml::xml_attribute<>*info_attr=info->first_attribute();//获取info属性
  6. cclog("%s:%s",info_attr->name(),info_attr->value());
  7. cclog("%s:%s",info_attr->next_attribute()->name(),info_attr->next_attribute()->value());
  8. rapidxml::xml_node<>*blog=info->first_node();//获取blog节点
  9. rapidxml::xml_node<>*website=blog->next_sibling();//获取website节点
  10. }

3.生成xml的文件

以上2种方式生成的xml文件内容如下:

[html] copy
    <Jacky>
  1. InfoName="Jacky"QQ="754505629"E-mail="Geek.Jacky@Gmail.com">
  2. blog>http://blog.csdn.net/jackystudio</website>http://www.fusijie.comInfo>

4.源码下载

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建