cocos2dx使用tinyxml创建和解析xml文件

cocos2dx使用tinyxml创建和解析xml文件,第1张

概述cocos2dx 2.2.5版里集成的tinyxml2不好用,总是报错,这里使用独立的第三方tinyxml库。 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows,Linux中,mac上编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),

cocos2dx 2.2.5版里集成的tinyxml2不好用,总是报错,这里使用独立的第三方tinyxml库。

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在windows,linux中,mac上编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。

DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。


准备

去官网下载tinyxml包后解压,将

tinystr.cpp
tinystr.h
tinyxml.cpp
tinyxml.h
tinyxmlerror.cpp
tinyxmlparser.cpp

这6个文件添加到工程,建议复制到classes文件下。



测试

首先包含头文件

#include "tinyxml.h"

创建XML文件

[cpp] view plain copy print ? voIDHelloWorld::createXML() { //创建一个XML的文档对象。 tixmldocument*mydocument=newtixmldocument(); //创建XML文档声明并连接 tixmlDeclaration*declaration=newtixmlDeclaration("1.0","UTF-8",""); mydocument->linkEndChild(declaration); //创建一个根元素并连接。 tixmlElement*RootElement=newtixmlElement("Class"); mydocument->linkEndChild(RootElement); //创建一个Student元素并连接。 tixmlElement*student1=newtixmlElement("Student"); RootElement->linkEndChild(student1); //设置Student元素的属性。 student1->SetAttribute("ID","1"); student1->SetAttribute("sex","boy"); student1->SetAttribute("hobby","fight"); //创建name元素、age元素并连接。 tixmlElement*nameElement1=newtixmlElement("name"); tixmlElement*AgeElement1=newtixmlElement("age"); student1->linkEndChild(nameElement1); student1->linkEndChild(AgeElement1); //设置name元素和age元素的内容并连接。 tixmlText*nameContent1=newtixmlText("lingHuchong"); tixmlText*AgeContent1=newtixmlText("22"); nameElement1->linkEndChild(nameContent1); AgeElement1->linkEndChild(AgeContent1); //创建另一个Student元素并连接。 tixmlElement*student2=newtixmlElement("Student"); RootElement->linkEndChild(student2); //设置Student元素的属性。 student2->SetAttribute("ID","2"); student2->SetAttribute("sex","girl"); student2->SetAttribute("hobby","dance"); //创建name元素、age元素并连接。 tixmlElement*nameElement2=newtixmlElement("name"); tixmlElement*AgeElement2=newtixmlElement("age"); student2->linkEndChild(nameElement2); student2->linkEndChild(AgeElement2); //设置name元素和age元素的内容并连接。 tixmlText*nameContent2=newtixmlText("RenYingying"); tixmlText*AgeContent2=newtixmlText("18"); nameElement2->linkEndChild(nameContent2); AgeElement2->linkEndChild(AgeContent2); //设置文件名,这是在cocos2dx里的路径写法,在标准c++中可以用string类型的绝对或相对路径字符串 std::stringPath=CCfileUtils::sharedfileUtils()->getWritablePath()+"test.xml"; mydocument->Savefile(Path.c_str());//保存到文件 //删除文档对象 deletemydocument; }
voID HelloWorld::createXML(){	//创建一个XML的文档对象。	tixmldocument *mydocument = new tixmldocument();	//创建XML文档声明并连接	tixmlDeclaration *declaration = new tixmlDeclaration("1.0","UTF-8","");	mydocument->linkEndChild(declaration);	//创建一个根元素并连接。	tixmlElement *RootElement = new tixmlElement("Class");	mydocument->linkEndChild(RootElement);	//创建一个Student元素并连接。	tixmlElement *student1 = new tixmlElement("Student");	RootElement->linkEndChild(student1);	//设置Student元素的属性。	student1->SetAttribute("ID","1");	student1->SetAttribute("sex","boy");	student1->SetAttribute("hobby","fight");	//创建name元素、age元素并连接。	tixmlElement *nameElement1 = new tixmlElement("name");	tixmlElement *AgeElement1 = new tixmlElement("age");	student1->linkEndChild(nameElement1);	student1->linkEndChild(AgeElement1);	//设置name元素和age元素的内容并连接。	tixmlText *nameContent1 = new tixmlText("ling Huchong");	tixmlText *AgeContent1 = new tixmlText("22");	nameElement1->linkEndChild(nameContent1);	AgeElement1->linkEndChild(AgeContent1);	//创建另一个Student元素并连接。	tixmlElement *student2 = new tixmlElement("Student");	RootElement->linkEndChild(student2);	//设置Student元素的属性。	student2->SetAttribute("ID","2");	student2->SetAttribute("sex","girl");	student2->SetAttribute("hobby","dance");	//创建name元素、age元素并连接。	tixmlElement *nameElement2 = new tixmlElement("name");	tixmlElement *AgeElement2 = new tixmlElement("age");	student2->linkEndChild(nameElement2);	student2->linkEndChild(AgeElement2);	//设置name元素和age元素的内容并连接。	tixmlText *nameContent2 = new tixmlText("Ren Yingying");	tixmlText *AgeContent2 = new tixmlText("18");	nameElement2->linkEndChild(nameContent2);	AgeElement2->linkEndChild(AgeContent2);	//设置文件名,这是在cocos2dx里的路径写法,在标准c++中可以用string类型的绝对或相对路径字符串	std::string Path = CCfileUtils::sharedfileUtils()->getWritablePath() + "test.xml";	mydocument->Savefile(Path.c_str());//保存到文件	//删除文档对象	delete mydocument;}


以上代码创建的xml文件如下 [HTML] view plain copy print ? <?xmlversion="1.0"enCoding="UTF-8"?> <Class> <StudentID="1"sex="boy"hobby="fight"> <name>lingHuchong</name> <age>22</age> </Student> <StudentID="2"sex="girl"hobby="dance"> <name>RenYingying</name> <age>18</age> </Student> </Class>
<?xml version="1.0" enCoding="UTF-8" ?><Class>    <Student ID="1" sex="boy" hobby="fight">        <name>ling Huchong</name>        <age>22</age>    </Student>    <Student ID="2" sex="girl" hobby="dance">        <name>Ren Yingying</name>        <age>18</age>    </Student></Class>
解析xml文件 [cpp] view plain copy print ? voIDHelloWorld::parseXML() { std::stringPath=CCfileUtils::sharedfileUtils()->getWritablePath()+"test.xml"; //创建一个XML的文档对象。 tixmldocument*mydocument=newtixmldocument(Path.c_str()); mydocument->Loadfile(); //或者这样写 /*tixmldocument*mydocument=newtixmldocument(); mydocument->Loadfile(Path.c_str());*/ tixmlElement*rootElement=mydocument->RootElement();//Class tixmlElement*studentElement=rootElement->FirstChildElement();//Students //遍历第一层结点 while(studentElement) { tixmlAttribute*attributeOfStudent=studentElement->FirstAttribute();//获得student的第一个属性 //遍历student的属性 while(attributeOfStudent) { cclog("%s:%s",attributeOfStudent->name(),attributeOfStudent->Value());//打印键值对 attributeOfStudent=attributeOfStudent->Next(); } tixmlElement*Element=studentElement->FirstChildElement();//获得student的第一个元素 //遍历student的元素 while(Element) { cclog("%s:%s",Element->Value(),Element->GetText());//打印键值对 Element=Element->NextSiblingElement(); } studentElement=studentElement->NextSiblingElement(); } //删除文档对象 deletemydocument; }
voID HelloWorld::parseXML(){	std::string Path = CCfileUtils::sharedfileUtils()->getWritablePath() + "test.xml";	//创建一个XML的文档对象。	tixmldocument *mydocument = new tixmldocument(Path.c_str());	mydocument->Loadfile();	//或者这样写	/*tixmldocument *mydocument = new tixmldocument();	mydocument->Loadfile(Path.c_str());*/	tixmlElement* rootElement = mydocument->RootElement();  //Class	tixmlElement* studentElement = rootElement->FirstChildElement();  //Students	//遍历第一层结点	while (studentElement) 	{		tixmlAttribute* attributeOfStudent = studentElement->FirstAttribute();  //获得student的第一个属性		//遍历student的属性		while (attributeOfStudent) 		{			cclog("%s:%s",attributeOfStudent->Value());  //打印键值对			attributeOfStudent = attributeOfStudent->Next();		}		tixmlElement* Element = studentElement->FirstChildElement();//获得student的第一个元素		//遍历student的元素		while (Element)		{			cclog("%s:%s",Element->GetText());   //打印键值对			Element = Element->NextSiblingElement();		}		studentElement = studentElement->NextSiblingElement();	}	//删除文档对象	delete mydocument;}


说明

关于TinyXML基本使用:

XML文档的结构:

TinyXml实现的时DOM访问模型,主要类间的关系如下图所示:

tixmlBase:其他类的基类,是个抽象类

tixmlNode:表示一个节点,包含一般方法,如访问自节点、兄弟节点、编辑自身、编辑子节点

tixmldocument:表示整个XML文档,不对应其中某个特定的节点。

tixmlElement:表示元素节点,可以包含子节点和tixmlAttribute

tixmlComment:表示注释

tixmlDeclaration:表示声明

tixmlText:表示文本节点

tixmlUnkNown:表示未知节点,通常是出错了

tixmlAttribute:表示一个元素的属性


注意:

在标准c++工程中这个库可以解析带有带有中文的xml文件,并cout打印到屏幕,不过在cocos2dx中的中文解析出来cclog打印就乱码,需要iconv库的支持。

总结

以上是内存溢出为你收集整理的cocos2dx使用tinyxml创建和解析xml文件全部内容,希望文章能够帮你解决cocos2dx使用tinyxml创建和解析xml文件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1002547.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存