1.下载TinyXml www.sourceforge.net/projects/tinyxml
2.下载后,将
tinystr.cpp
tinystr.h
tinyxml.cpp
tinyxml.h
tinyxmlerror.cpp
tinyxmlparser.cpp
这6个文件
移动到 Classes里面
3.编写测试:
[cpp] view plain copy #include"ParseXMLLayer.h" #include"tinyxml.h" ParseXMLLayer::~ParseXMLLayer(){ } voIDParseXMLLayer::onEnter(){ cclayer::onEnter(); tixmldocument*mydocument=newtixmldocument(CCfileUtils::sharedfileUtils()->fullPathFromrelativePath("test.xml")); mydocument->Loadfile(); tixmlElement*rootElement=mydocument->RootElement();//Class tixmlElement*studentsElement=rootElement->FirstChildElement();//Students tixmlElement*studentElement=studentsElement->FirstChildElement();//student while(studentElement){ tixmlAttribute*attributeOfStudent=studentElement->FirstAttribute();//获得student的name属性 while(attributeOfStudent){ cclOG("%s:%s",attributeOfStudent->name(),attributeOfStudent->Value()); //std::cout<<attributeOfStudent->name()<<":"<<attributeOfStudent->Value()<<std::endl; attributeOfStudent=attributeOfStudent->Next(); } tixmlElement*phoneElement=studentElement->FirstChildElement();//获得student的phone元素 cclOG("phone:%s",phoneElement->GetText()); //std::cout<<"phone"<<":"<<phoneElement->GetText()<<std::endl; tixmlElement*addressElement=phoneElement->NextSiblingElement(); cclOG("address:%s",addressElement->GetText()); //std::cout<<"address"<<":"<<phoneElement->GetText()<<std::endl; studentElement=studentElement->NextSiblingElement(); } deletemydocument; }test.xml如下: [HTML] view plain copy <?xmlversion="1.0"enCoding="UTF-8"?> <Classname="计算机软件班"> <Students> <studentname="张三"studentNo="13031001"sex="男"age="22"> <phone>88208888</phone> <address>西安市太白南路二号</address> </student> <studentname="李四"studentNo="13031002"sex="男"age="20"> <phone>88206666</phone> <address>西安市光华路</address> </student> </Students> </Class>
关于TinyXML基本使用:
XML文档的结构:
TinyXml实现的时DOM访问模型,主要类间的关系如下图所示:
tixmlBase:其他类的基类,是个抽象类
tixmlNode:表示一个节点,包含一般方法,如访问自节点、兄弟节点、编辑自身、编辑子节点
tixmldocument:表示整个XML文档,不对应其中某个特定的节点。
tixmlElement:表示元素节点,可以包含子节点和tixmlAttribute
tixmlComment:表示注释
tixmlDeclaration:表示声明
tixmlText:表示文本节点
tixmlUnkNown:表示未知节点,通常是出错了
tixmlAttribute:表示一个元素的属性
对于一个如下结构的.XML文档, *** 作如下
[HTML] view plain copy <Persons> <PersonID="1"> <name>周星星</name> <age>20</age> </Person> <PersonID="2"> <name>白晶晶</name> <age>18</age> </Person> </Persons>1.创建一个XML的文档对象 [cpp] view plain copy tixmldocument*mydocument=newtixmldocument("填上你的Xml文件名");//可以有(相对)路径 mydocument->Loadfile();
2.获得根元素,即Persons [cpp] view plain copy tixmlElement*RootElement=mydocument.RootElement(); cout<<RootElement->Value()<<endl;//输出根元素名称,即输出Persons。
3.获得第一个Person节点,就第一个子结点 ,若不tixmlEelement的,用FirstChild() [cpp] view plain copy tixmlElement*FirstPerson=RootElement->FirstChildElement();
4.获得第一个Person的name节点和age节点和ID属性 [cpp] view plain copy tixmlElement*nameElement=FirstPerson->FirstChildElement(); tixmlElement*AgeElement=nameElement->NextSiblingElement(); tixmlAttribute*IDAttribute=FirstPerson->FirstAttribute();
5.指向下一个同级的结点 用NextSiblingElement();
就是指向下一个兄弟节点
6.输出第一个Person的内容,即周星星;即20;ID属性1。这里的nameElement只是指向 <name>,nameElement->value()就是 name ,
而不是周星星,“周星星”是一个文本格式的结点,而要nameElement->FirstChild()来指向它
7.创建一个XML的文档对象 [cpp] view plain copy tixmldocument*mydocument=newtixmldocument();
8.创建一个根元素并连接 [cpp] view plain copy tixmlElement*RootElement=newtixmlElement("Persons"); mydocument->linkEndChild(RootElement);
9.创建一个Person元素并连接 [cpp] view plain copy tixmlElement*PersonElement=newtixmlElement("Person"); RootElement->linkEndChild(PersonElement);
10.设置Person元素的属性 [cpp] view plain copy PersonElement->SetAttribute("ID","1");
11.创建name元素、age元素并连接 [cpp] view plain copy tixmlElement*nameElement=newtixmlElement("name"); tixmlElement*AgeElement=newtixmlElement("age"); PersonElement->linkEndChild(nameElement); PersonElement->linkEndChild(AgeElement);
12.设置name元素和age元素的内容并连接 [cpp] view plain copy tixmlText*nameContent=newtixmlText("周星星"); tixmlText*AgeContent=newtixmlText("20"); nameElement->linkEndChild(nameContent); AgeElement->linkEndChild(AgeContent);
13.保存到文件 [cpp] view plain copy mydocument->Savefile("要保存的xml文件名");
这样,便创建了一个如下的xml文件:
<Persons>
<Person ID="1">
<name>周星星</name>
<age>20</age>
</Person>
</Persons>
14.删除一个结点 voID ParentEelement->RemoveChild(指定的子结点)
删除所有的子结点voID ParentEelement->Clear()
15.返回第一个子结点
<结点类型> ParentEelement->FirstChild();//或是FirstChildElement();(确定子结点为tixmlElement类型用)
16.返回最后一个子结点
<结点类型> ParentEelement->LastChild();//或是LastChildElement();(确定子结点为tixmlElement类型用)
17.返回同级的后一个结点
<结点类型> Eelement->NextSibling();//或是NextSiblingElement();(确定后一结点为tixmlElement类型用)
18.返回同级的前一个结点
<结点类型> Eelement->PrevIoUsSibling();//或是PrevIoUsSiblingElement();(确定后一结点为tixmlElement类型用)
19.替换指定的子结点
ParentElement->ReplaceChild("要替换的子结点","新的结点");
20.返回结点的父结点
<结点类型> ChildElement -> Parent();
21属性类
属性为名称="值"对,元素可以具有属性值,但名称必须唯一。
你可以通过
+const std::string& nameTstr() const
返回属性名称
也可以通过下面三个函数返回属性值:
+const std::string& Valuestr() const
+int IntValue() const;
+double DoubleValue() const;
当然你也可以设置属性值,它们的函数声明如下:
+voID Setname( const std::string& _name )
+voID SetIntValue( int _value );
+voID SetDoubleValue( double _value );
+voID SetValue( const std::string& _value )
在元素属性中,通常具有许多属性,你可以通过Next函数返回下一个属性对象的指针,也可以通过PrevIoUs函数获得上一个属性对象的指针。它们的函数声明如下:
+tixmlAttribute* Next()
+tixmlAttribute* PrevIoUs()
以上就是TinyXML的一些常的 *** 作方法。
扩展:使用TinyXml库值得注意的问题
http://blog.csdn.net/hoyt00/article/details/6769883
-------------tinyxml在androID上解析assert文件夹下会有问题:解决方式如下:
[cpp] view plain copy constchar*filePath=CCfileUtils::sharedfileUtils()->fullPathFromrelativePath("levels/testbb.xml"); unsignedlongsize; char*pfileContent=(char*)CCfileUtils::sharedfileUtils()->getfileData(filePath,"r",&size); tixmldocument*mydocument=newtixmldocument; mydocument->Parse(pfileContent,tixML_ENCoding_UTF8);这样就能获得 [cpp] view plain copy mydocument 总结
以上是内存溢出为你收集整理的cocos2dx XML配置文件读取详解全部内容,希望文章能够帮你解决cocos2dx XML配置文件读取详解所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)