cocos2d-x使用tinyxml2存储解析xml

我用的是2.1.4的cocos2d-x,里面自带有tinyxml2库。

导入头文件:
#include "support/tinyxml2/tinyxml2.h"

using namespace tinyxml2;

一:创建xml并保存

void TinyXmlDemo::createTinyXMLFile()
{
    //储存XML文件的路径
    std::string    filePath = CCFileUtils::sharedFileUtils()->getWritablePath() + "tinyxmltest.xml";
    //xml文档
    tinyxml2::XMLDocument* pDoc = new tinyxml2::XMLDocument();
    if (pDoc == NULL)
    {
        return;
    }
     //xml声明
    XMLDeclaration* pDecl = pDoc->NewDeclaration("xml version=\"1.0\" encoding=\"UTF-8\"");
    if (pDecl == NULL)
    {
        return;
    }
    pDoc->LinkEndChild(pDecl);
    //节点plist
    XMLElement* plistElement = pDoc->NewElement("plist");
    plistElement->SetAttribute("version","1.0");
    pDoc->LinkEndChild(plistElement);

    //节点dict
    XMLElement* dictElement = pDoc->NewElement("dict");
    plistElement->LinkEndChild(dictElement);
    //节点key
    XMLElement* keyElement = pDoc->NewElement("key");
    keyElement->LinkEndChild(pDoc->NewText("keyText"));//给节点设置值
    dictElement->LinkEndChild(keyElement);
    //节点string
    XMLElement* stringElement = pDoc->NewElement("string");
    stringElement->LinkEndChild(pDoc->NewText("stringText"));//给节点设置值
    dictElement->LinkEndChild(stringElement);
    //节点array
    XMLElement* arrayElemet = pDoc->NewElement("array");
    dictElement->LinkEndChild(arrayElemet);
    for (int i = 0; i<3; i++)
    {
        XMLElement* strEle = pDoc->NewElement("string");
        strEle->LinkEndChild(pDoc->NewText("icon"));
        arrayElemet->LinkEndChild(strEle);
    }
    //保存文件
    pDoc->SaveFile(filePath.c_str());
    delete pDoc;

}

在win32上xml保存的路径是在D:\cocos2d-x-2.1.4\cocos2d-x-2.1.4\Debug.win32里面

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
    <dict>
        <key>keyText</key>
        <string>stringText</string>
        <array>
            <string>icon</string>
            <string>icon</string>
            <string>icon</string>
        </array>
    </dict>
</plist>

二:解析xml

void TinyXmlDemo::parseTinyXMLFile()
{
    //储存XML文件的路径
    std::string    filePath = CCFileUtils::sharedFileUtils()->getWritablePath() + "tinyxmltest.xml";
    tinyxml2::XMLDocument* pDoc = new tinyxml2::XMLDocument();
    pDoc->LoadFile(filePath.c_str());
    //得到根节点
    XMLElement* rootElement = pDoc->RootElement();
    //打印根节点名字和值
    CCLog("%s,%s",rootElement->Value(),rootElement->GetText());
    //节点的第一个属性
    const XMLAttribute* attribute = rootElement->FirstAttribute();
    //打印属性的名字和值
    CCLog("%s %s",attribute->Name(),attribute->Value());
    //查找节点的属性值
    float value = 0.1f;
    rootElement->QueryFloatAttribute("version",&value);
    CCLog("%f",value);
    //设置节点属性值
    rootElement->SetAttribute("version", 1.4);
    //跟节点的第一个字节点 dict
    XMLElement *dictEle = rootElement->FirstChildElement();
    //dict下面的子节点 key
    XMLElement *keyEle = dictEle->FirstChildElement();
    //打印key节点的值
    CCLog("%s,%s",keyEle->Name(),keyEle->GetText());
    //key节点的next节点 string
    XMLElement *stringEle = keyEle->NextSiblingElement();
    CCLog("%s,%s",stringEle->Name(),stringEle->GetText());
    //string节点的子节点
    XMLElement *nulXmlEle = stringEle->FirstChildElement();
    if (NULL == nulXmlEle) {
        CCLog("string no childElement");
    }
    //array节点
    XMLElement *arrayEle= stringEle->NextSiblingElement();
    CCLog("%s,%s",arrayEle->Name(),arrayEle->GetText());
    XMLElement *array1 = arrayEle->FirstChildElement();
    CCLog("%s,%s",array1->Name(),array1->GetText());
    XMLElement *array2 = array1->NextSiblingElement();
    CCLog("%s,%s",array2->Name(),array2->GetText());
    XMLElement *array3 = arrayEle->LastChildElement();
    CCLog("%s,%s",array3->Name(),array3->GetText());

    //修改了xml记得保存
    pDoc->SaveFile(filePath.c_str());
}

打印输出:

plist,(null)
version 1.0
1.000000
key,keyText
string,stringText
string no childElement
array,(null)
string,icon
string,icon
string,icon

由于修改了节点属性值,保存后的xml

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.4">
    <dict>
        <key>keyText</key>
        <string>stringText</string>
        <array>
            <string>icon</string>
            <string>icon</string>
            <string>icon</string>
        </array>
    </dict>
</plist>

参考http://blog.csdn.net/w18767104183/article/details/19837203

时间: 2024-11-07 18:13:45

cocos2d-x使用tinyxml2存储解析xml的相关文章

7.数据本地化CCString,CCArray,CCDictionary,tinyxml2,写入UserDefault.xml文件,操作xml,解析xml

 数据本地化 A CCUserDefault 系统会在默认路径cocos2d-x-2.2.3\projects\Hello\proj.win32\Debug.win32下生成一个名为UserDefault.xml.所有的key皆为char *型,value类型为bool intfloat double std::string. 读操作 bool getBoolForKey(const char* pKey); bool getBoolForKey(const char* pKey, bool

《转》 在C++中使用TinyXML2解析xml

读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译.这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树. DOM模型即文档对象模型,是将整个文档分成多个元素(如书.章.节.段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包

在C++中使用TinyXML2解析xml

读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译.这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树. DOM模型即文档对象模型,是将整个文档分成多个元素(如书.章.节.段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包

Android应用开发之存储和解析xml文件

package com.m520it.saveandparseXML; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import com.m520it.temp1.R; public class MainActivity extends Activity { @Override protected void onCr

android菜鸟学习笔记19----Android数据存储(三)XML文件的解析及序列化

Android内置了PULL解析器的XPP3实现,以及SAX解析器等,可以直接使用PULL或SAX解析XML,直接把JAVA中进行PULL或SAX解析的代码直接拿来用,遗忘的话,可以参考java拾遗1,2,3关于XML的解析: 如有如下XmlUtils类实现PULL方式解析XML到List和序列化List到XML: Student实体类代码: 1 package cn.csc.bean; 2 3 public class Student { 4 5 private String id; 6 7

windows客户端开发--使用tinyxml库解析xml文件

例如,微信windows客户端使用的duilib库中,界面就是用xml进行描述的. 所以,今天我们就来谈一谈windows客户端中,也就是C++中如何解析xml. 很多时候,我们都使用.ini文件来存储一些数据. xml确实是有很多的优点,某种程度上来说也确实可以完全取代ini,但也并非如有些人鼓吹的处处都比ini强. xml,对于描述复杂的数据结构非常的方便,缺点相对ini使用麻烦一点.在表达较短的配置时,没有ini简练.而且因为它有比较严格的格式审查机制,容错性也不是特别好,在手写时容易出现

cocos2dx 3.1.1 用tinyxml2.h解释xml (C++)

cocos2dx 3.1.1怎样用tinyxml2.h解释xml? (C++) cocos2dx已经自带了tinyxml2用于xml的解释,很早之前从2.x的版本开始已经无需再特地去下载. 不过,tinyxm2关于3.x引擎的文档比较少,特此来贡献一个! 首先加入头文件: #include "cocos-ext.h" #include "tinyxml2/tinyxml2.h" using namespace tinyxml2; using namespace st

四种生成和解析XML文档的方法详解

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 一.介绍及优缺点分析 1. DOM(Document Object Model) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的. [优点]      ①允许应用

解析xml文件的几个步骤

1.生成xml文件的解析器 XmlPullParser parser = Xml.newPullParser(); 2.设置解析器读取流对象的编码格式 parser.setInput(is, "utf-8"); 3.设置解析xml文件之后要存储的位置 List<WeatherInfo> weatherInfo = null; WeatherInfo info = null; 4.定义解析器解析到的事件类型 int type = parser.getEventType();