文档章节

cocos2dx中调用TinyXml读取xml配置文件

霄霄月月
 霄霄月月
发布于 2014/05/11 16:04
字数 1145
阅读 2965
收藏 1
点赞 0
评论 0

第一步:

 先要在TinyXml增加函数 bool TiXmlDocument::LoadMemory( const char * pBuff, int length, TiXmlEncoding encoding )

/// Load Xml form memory buff. Returns true if successful.
 
bool TiXmlDocument::LoadMemory( const char * pBuff, int length, TiXmlEncoding encoding )
 
{
 
if ( !pBuff || length == 0 )
 
{
 
SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN );
 
return false;
 
}
 
// If we have a file, assume it is all one big XML file, and read it in.
 
// The document parser may decide the document ends sooner than the entire file, however.
 
TIXML_STRING data;
 
data.reserve( length );
 
char* buf = new char[ length+1 ];
 
buf[0] = 0;
 
memcpy( buf, pBuff, length );
 
const char* lastPos = buf ;
 
const char* p = buf ;
 
buf[length] = 0;
 
while( *p ) {
 
assert( p < (buf+length) );
 
if ( *p == 0xa ) {
 
// Newline character. No special rules for this. Append all the characters
 
// since the last string, and include the newline.
 
data.append( lastPos, (p-lastPos+1) );        // append, include the newline
 
++p;                                                                        // move past the newline
 
lastPos = p;                                                        // and point to the new buffer (may be 0)
 
assert( p <= (buf+length) );
 
}
 
else if ( *p == 0xd ) {
 
// Carriage return. Append what we have so far, then
 
// handle moving forward in the buffer.
 
if ( (p-lastPos) > 0 ) {
 
data.append( lastPos, p-lastPos );        // do not add the CR
 
}
 
data += (char)0xa;                                                // a proper newline
 
if ( *(p+1) == 0xa ) {
 
// Carriage return - new line sequence
 
p += 2;
 
lastPos = p;
 
assert( p <= (buf+length) );
 
}
 
else {
 
// it was followed by something else...that is presumably characters again.
 
++p;
 
lastPos = p;
 
assert( p <= (buf+length) );
 
}
 
}
 
else {
 
++p;
 
}
 
}
 
// Handle any left over characters.
 
if ( p-lastPos ) {
 
data.append( lastPos, p-lastPos );
 
}
 
delete [] buf;
 
buf = 0;
 
Parse( data.c_str(), 0, encoding );
 
if (  Error() )
 
{
 
return false;
 
}
 
return true;
 
}

第二步骤 调用

void readXml()
{
    string documentPath =  "heroList.xml";
    TiXmlDocument *myDocument = new TiXmlDocument(documentPath.c_str());//"WriteTest.xml");
    if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    {
        /*因为android无法读取assets下的xml数据文件,ios同样存在读取问题,这个具体原因是因为apk和app实质上是一个压缩包,
        压缩包的内容读取不同于一般的文件读取,因为文件已经被压缩过了,
        所以采用了读取buffer的方法,通过将buffer交给LoadMemory解析,初始化TiXmlDocument *myDocument 中的数据。
        */
        unsigned long nLength = 0;
        char* pBuff = (char*)cocos2d::CCFileUtils::sharedFileUtils()->getFileData(CCFileUtils::sharedFileUtils()->fullPathForFilename(documentPath.c_str()).c_str(),"rt", &nLength );
        myDocument->LoadMemory( pBuff, nLength);
    }
    else
    {
        myDocument->LoadFile();
    }
    TiXmlElement *RootElement = myDocument->RootElement();/*读取根节点*/
    if(RootElement == NULL)
    {
        //LD("read from data xml error!");
    }
    TiXmlElement *FirstPerson = RootElement->FirstChildElement();/*读取根节点中的第一个节点数据*/
    while (FirstPerson)
    {
        CCLog("node name = %s",FirstPerson->Value());
        TiXmlAttribute *idAttribute = FirstPerson->FirstAttribute();/*我的文件中有两个属性值,一个是id属性*/
        TiXmlAttribute *decAttribute = idAttribute->Next();/*我的文件中有两个属性值,一个是描述属性*/
        CCLog("attrName = %s,attrValue = %d",idAttribute->Name(),atoi(idAttribute->Value()));/*打印出属性名称和属性值*/
        CCLog("attrName = %s,attrValue = %s",decAttribute->Name(),decAttribute->Value());
        TiXmlElement *firstChild = FirstPerson->FirstChildElement();/*读取第一个节点的第一个子节点*/
        map<string,int> tempMap;
        while(firstChild)
        {
            /*读取第一个节点的数据*/
            CCLog("childName = %s,childValue = %d",firstChild->Value(),atoi(firstChild->GetText()));
            tempMap.insert(map<string, int>::value_type (firstChild->Value(), atoi(firstChild->GetText())));
            firstChild = firstChild->NextSiblingElement();/*读取完第一个节点的数据,firstChild指针向后移位,读取下一个节点的数据*/
            string childName = string(firstChild->Value());
            if ( childName == "boundRidus")
            {
                break;
            }
        }
        while(firstChild)
        {
            /*我自定义的"heroList.xml"中,本子节点有三个属性,依次读取三个属性,详细的数据已经注释在代码中了*/
            TiXmlAttribute *posXAttribute = firstChild->FirstAttribute();
            TiXmlAttribute *posYAttribute = posXAttribute->Next();
            TiXmlAttribute *radiusAttr = posYAttribute->Next();
            CCLog("attriName = %s,attriValue = %d",posXAttribute->Name(),atoi(posXAttribute->Value()));
            firstChild = firstChild->NextSiblingElement();
        }
        //m_heroDatas.push_back(hData);
        FirstPerson = FirstPerson->NextSiblingElement();
    }
    writeLevel(1);
    writeXml();
}




void writeLevel(int level)
{
    /*生成xml文件,这个尽量不要在正式的程序中使用,生成的xml数据只是为了方便配置数据的人员方便配置*/
    const char * attribut[12] = {"mId","aId","pId","pAId","posX","posY","mType","explodeEffect","data8","data9","data10","data11"};
    TiXmlDocument doc ;
    TiXmlDeclaration *declare =new TiXmlDeclaration("1.0" , "","");
    doc.LinkEndChild(declare);
    doc.LinkEndChild(new TiXmlComment("levelDataInf"));
    TiXmlElement *root = new TiXmlElement("levelDataConfig");
    for (int i=0;i!=4;++i)
    {
        TiXmlElement *sub = new TiXmlElement("createMonsters");
        sub->SetAttribute("order" , i); // 向sub中添加属性
        for(int enemyC=0;enemyC!=7;++enemyC)
        {
            TiXmlElement *monster = new TiXmlElement("monster");
            for (int j=0;j!=12;++j)
            {
                monster->SetAttribute(attribut[j] , j); 
            }
            // 向sub中添加属性
            sub->LinkEndChild(monster); // 将child追加到sub中,以作为子元素
        }
        root->LinkEndChild(sub); // 将sub
    }
    doc.LinkEndChild(root);
    string documentPath = "levelTest.xml";
    doc.SaveFile(documentPath.c_str());
}

void writeXml()
{
    /*写文件,如果程序中使用了xml的进行读写数据,可以使用这个来重新写入游戏配置数据,不过本人尽量推荐使用CCUserDefault来做*/
    TiXmlDocument doc ;
    TiXmlDeclaration *declare =new TiXmlDeclaration("1.0" , "","");
    doc.LinkEndChild(declare);
    doc.LinkEndChild(new TiXmlComment("personalInfo"));

    TiXmlElement *personalInfo = new TiXmlElement("personalInfo");    
    doc.LinkEndChild(personalInfo);

    personalInfo->SetAttribute("userId", 0);    
    personalInfo->SetAttribute("loginTime", 0);
    personalInfo->SetAttribute("url", 0);        
    personalInfo->SetAttribute("scoreRecord", 0);    
    personalInfo->SetAttribute("coinTotal", 0);
    personalInfo->SetAttribute("diamondTotal", 0);
    personalInfo->SetAttribute("character", 0);        
    personalInfo->SetAttribute("knife",0);
    personalInfo->SetAttribute("sprint", 0);
    personalInfo->SetAttribute("protectCover", 9);
    personalInfo->SetAttribute("currentLevel",9);
    string documentPath = CCFileUtils::sharedFileUtils()->getWritablePath()+"writeData.xml";
    /*此路径win 在../proj.win32/Debug.win32,android在/data/data/包名/,如果是ios在*/
    doc.SaveFile(documentPath.c_str());
}

下面介绍TinyXML的一些类。在TinyXML中,根据XML的各种元素来定义了一些类:
           TiXmlBase:整个TinyXML模型的基类。 TiXmlAttribute:对应于XML中的元素的属性。 TiXmlNode:对应于DOM结构中的节点。 TiXmlComment:对应于XML中的注释 TiXmlDeclaration:对应于XML中的申明部分,<?versiong="1.0" ?>。 TiXmlDocument:对应于XML的整个文档。 TiXmlElement:对应于XML的元素。 TiXmlText:对应于XML的文字部分 TiXmlUnknown:对应于XML的未知部分。         TiXmlHandler:定义了针对XML的一些操作。


本文转载自:

共有 人打赏支持
霄霄月月
粉丝 34
博文 40
码字总数 32350
作品 0
成都
程序员
C++ 使用TinyXML解析XML文件

读取和设置xml配置文件是最常用的操作,TinyXML是一个开源的解析XML的C++解析库,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便...

LoSingSang
07/17
0
0
TinyXML:一个优秀的C++ XML解析器

读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解...

zmldndx
2013/10/10
0
0
C++ XML 解析器:tinyxml

[tinyxml2]: http://www.grinninglizard.com/tinyxml2/index.html C++ XML 解析器:[tinyxml][tinyxml2] 1) [TinyXML-2][tinyxml2] 一个简单,轻量,高效的C++ XML 解析器,能够很容易得整合......

加壹
2014/04/24
0
0
wxWidgets利用tinyxml实现xml解析

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 Windows Linux

nardoo
2012/09/06
0
0
将“数据驱动”思想应用到cocos2d-x游戏Stop GMO

1.首先,数据驱动是什么? 这个问题,我不敢回答,因为我也是刚刚从《游戏编程精粹1》这本书上了解到的,我并不完全了解它。关于数据驱动的介绍,可以参考《游戏编程精粹1》的第一章第一节(...

萝卜胡
2013/01/13
0
2
【iOS-cocos2d-X 游戏开发之五】游戏存储之Cocos2dX自带CCUserDefault类详解;

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2dx/653.html 本篇跟大家分享下Cocos2dX中的存储,其中也...

迷途d书童
2012/03/19
0
0
Cocos2dx游戏开发系列笔记1:一个崭新的开始,cocos2dx2.2+ndkr9+Cygwin

Android开发者做cocos2dx最大的绊脚石,不是c++,而是环境的搭建... 骨头也是费了半天劲才终于在真机上看到了那个类似猕猴桃的头,这里简单记录一下。 环境:(算比较新了2013.11.17) coco...

懒骨头
2013/12/09
0
0
杨超 (wantnon)/EffectNodes-for-Cocos2dx

EffectNodes for Cocos2dx by yang chao (wantnon), 2014-6-26 EffectNodes for Cocos2dx is a collection of 2d special effects implemented with cocos2dx. i will add more when i got g......

杨超 (wantnon)
05/09
0
0
tinyxml在MFC下使用问题

今天在MFC下使用tinyXML库出现了一些问题,差了一下,有些人遇到了和我差不多的问题, 主要是库的冲突,现在还不知道怎么弄,我想在MFC使用tinyXML去解析界面控件的属性现在估计 不能使用了,...

ryany
2010/12/20
0
0
cocos2d-x js模版修改

创建cocos2d-x项目,导入引擎模版,避免每次都拷贝引擎到项目中,修改路径: D:commonscocos2d-xcocos2d-2.1rc0-x-2.1.3templatemsvcCCAppWiz.win32Scripts1033下的js文件如下: // Additio...

石头哥哥
2013/08/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

单身税的时代就要来临,你还没有用Python帮你找一个女朋友吗?

单身税的历史可以追溯到2015年韩国的新政, 低生育率逼得韩国产生了这一政策。 现在我国也要实行这一政策, 很多单身狗就接受不了了 很可惜,国家不包分配对象, 男的都说找对象难, 有没有向...

猫咪编程
14分钟前
0
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
18分钟前
0
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
0
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
0
0
流利阅读笔记33-20180722待学习

黑暗中的生物:利用奇技淫巧快活生存 Daniel 2018-07-22 1.今日导读 如果让你在伸手不见五指的黑暗当中生存,你能熬过几天呢?而大千世界,无奇不有。在很多你不知道的角落,有些生物在完全黑...

aibinxiao
昨天
4
0
Hystrix降级逻辑中如何获取触发的异常

通过之前Spring Cloud系列教程中的《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》一文,我们已经知道如何通过Hystrix来保护自己的服务不被外部依赖方拖垮的情况。但是实际...

程序猿DD
昨天
0
0
gin endless 热重启

r := gin.New()r.GET("/", func(c *gin.Context) {c.String(200, config.Config.Server.AppId)})s := endless.NewServer(":8080", r)s.BeforeBegin = func(add string) ......

李琼涛
昨天
0
0
JAVA模式之代理模式

平时一直在用spring,spring中最大的特效IOC和AOP,其中AOP使用的就是代理模式.闲着无聊,随手写了一个代理模式,也记录下代理模式的实现Demo. 比如现在有一个场景是:客户想要增加一个新的功能,...

勤奋的蚂蚁
昨天
0
0
ES15-JAVA API 索引管理

1.创建连接 创建连接demo package com.sean.esapi.client;import java.net.InetSocketAddress;import org.elasticsearch.action.get.GetResponse;import org.elasticsearch.clien......

贾峰uk
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部