加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 19:03:31 所属栏目:百科 来源:网络整理
导读:cocos2dx 2.2.5版里集成的tinyxml2不好用,总是报错,这里使用独立的第三方tinyxml库。 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows,Linux中,mac上编译。这个解析库的模型通过解析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 ?
  1. voidHelloWorld::createXML()
  2. {
  3. //创建一个XML的文档对象。
  4. TiXmlDocument*myDocument=newTiXmlDocument();
  5. //创建xml文档声明并连接
  6. TiXmlDeclaration*declaration=newTiXmlDeclaration("1.0","UTF-8","");
  7. myDocument->LinkEndChild(declaration);
  8. //创建一个根元素并连接。
  9. TiXmlElement*RootElement=newTiXmlElement("Class");
  10. myDocument->LinkEndChild(RootElement);
  11. //创建一个Student元素并连接。
  12. TiXmlElement*student1=newTiXmlElement("Student");
  13. RootElement->LinkEndChild(student1);
  14. //设置Student元素的属性。
  15. student1->SetAttribute("ID","1");
  16. student1->SetAttribute("sex","boy");
  17. student1->SetAttribute("hobby","fight");
  18. //创建name元素、age元素并连接。
  19. TiXmlElement*NameElement1=newTiXmlElement("name");
  20. TiXmlElement*AgeElement1=newTiXmlElement("age");
  21. student1->LinkEndChild(NameElement1);
  22. student1->LinkEndChild(AgeElement1);
  23. //设置name元素和age元素的内容并连接。
  24. TiXmlText*NameContent1=newTiXmlText("LingHuchong");
  25. TiXmlText*AgeContent1=newTiXmlText("22");
  26. NameElement1->LinkEndChild(NameContent1);
  27. AgeElement1->LinkEndChild(AgeContent1);
  28. //创建另一个Student元素并连接。
  29. TiXmlElement*student2=newTiXmlElement("Student");
  30. RootElement->LinkEndChild(student2);
  31. //设置Student元素的属性。
  32. student2->SetAttribute("ID","2");
  33. student2->SetAttribute("sex","girl");
  34. student2->SetAttribute("hobby","dance");
  35. //创建name元素、age元素并连接。
  36. TiXmlElement*NameElement2=newTiXmlElement("name");
  37. TiXmlElement*AgeElement2=newTiXmlElement("age");
  38. student2->LinkEndChild(NameElement2);
  39. student2->LinkEndChild(AgeElement2);
  40. //设置name元素和age元素的内容并连接。
  41. TiXmlText*NameContent2=newTiXmlText("RenYingying");
  42. TiXmlText*AgeContent2=newTiXmlText("18");
  43. NameElement2->LinkEndChild(NameContent2);
  44. AgeElement2->LinkEndChild(AgeContent2);
  45. //设置文件名,这是在cocos2dx里的路径写法,在标准c++中可以用string类型的绝对或相对路径字符串
  46. std::stringPath=CCFileUtils::sharedFileUtils()->getWritablePath()+"test.xml";
  47. myDocument->SaveFile(Path.c_str());//保存到文件
  48. //删除文档对象
  49. deletemyDocument;
  50. }


以上代码创建的xml文件如下
[html] view plain copy print ?
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <Class>
  3. <StudentID="1"sex="boy"hobby="fight">
  4. <name>LingHuchong</name>
  5. <age>22</age>
  6. </Student>
  7. <StudentID="2"sex="girl"hobby="dance">
  8. <name>RenYingying</name>
  9. <age>18</age>
  10. </Student>
  11. </Class>
解析xml文件
[cpp] view plain copy print ?
  1. voidHelloWorld::parseXML()
  2. {
  3. std::stringPath=CCFileUtils::sharedFileUtils()->getWritablePath()+"test.xml";
  4. //创建一个XML的文档对象。
  5. TiXmlDocument*myDocument=newTiXmlDocument(Path.c_str());
  6. myDocument->LoadFile();
  7. //或者这样写
  8. /*TiXmlDocument*myDocument=newTiXmlDocument();
  9. myDocument->LoadFile(Path.c_str());*/
  10. TiXmlElement*rootElement=myDocument->RootElement();//Class
  11. TiXmlElement*studentElement=rootElement->FirstChildElement();//Students
  12. //遍历第一层结点
  13. while(studentElement)
  14. {
  15. TiXmlAttribute*attributeOfStudent=studentElement->FirstAttribute();//获得student的第一个属性
  16. //遍历student的属性
  17. while(attributeOfStudent)
  18. {
  19. CCLog("%s:%s",attributeOfStudent->Name(),attributeOfStudent->Value());//打印键值对
  20. attributeOfStudent=attributeOfStudent->Next();
  21. }
  22. TiXmlElement*Element=studentElement->FirstChildElement();//获得student的第一个元素
  23. //遍历student的元素
  24. while(Element)
  25. {
  26. CCLog("%s:%s",Element->Value(),Element->GetText());//打印键值对
  27. Element=Element->NextSiblingElement();
  28. }
  29. studentElement=studentElement->NextSiblingElement();
  30. }
  31. //删除文档对象
  32. deletemyDocument;
  33. }


说明

关于TinyXML基本使用:

XML文档的结构:

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

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

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

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

TiXmlElement:表示元素节点,可以包含子节点和TiXmlAttribute

TiXmlComment:表示注释

TiXmlDeclaration:表示声明

TiXmlText:表示文本节点

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

TiXmlAttribute:表示一个元素的属性


注意:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读