简介
cocos2dx 3.2读写XML使用的是tinyxml2库。tinyxml2是一个轻量的解析XML的开源库,C++编写,跨平台,内存占用很小。解析文件时,在内存中生成DOM模型,即文档对象模型,遍历这颗树读取想要的数据。
UserDefault类是一个引擎封装好的XML读取类,但是使用这个类读写的XML的文件名固定为UserDefault.xml,并且不能灵活定义文档结构。所以对有特殊XML需求的项目中,就不太适用了。而如果在项目中直接使用tinyxml2库,感觉还不是很方便,所以基于tinyxml2又封装了一个XMLManager类,使用起来更方便,并且能够灵活创建、读取不同结构的XML文件。
XMLManager类同时提供了一个中文资源国际化的方法,一般小项目可能会用到,把中文存到XML文件中读取。
类图
代码
tinyxml2的使用方法可以参照一下如下代码,代码的注释以及使用方法也写得比较详细。
头文件:
/*
* WWXMLManager.h
*
* Created on: 2014年5月20日
* Author: wly
*/
#ifndef _WWXMLMANAGER_H_
#define _WWXMLMANAGER_H_
#include "cocos2d.h"
//#include "tinyxml2.h"
#include "tinyxml2/tinyxml2.h"
/*
* 属性类,这里属性是只读的,修改请使用WWXMLNode类
* <express name="test" value="nothing">This is a test!</express>
* name 和 value 就是结点的属性
*/
class WWXMLAttribute
{
public:
WWXMLAttribute(const tinyxml2::XMLAttribute *pXMLAttribute);
~WWXMLAttribute();
//下一个属性值
WWXMLAttribute next();
//获取属性名称
const char* getName();
//获取string类型属性值
const char* value();
//获取int类型属性值
int intValue();
//获取bool类型属性值
bool boolValue();
//获取float类型属性值
float floatValue();
//获取double类型属性值
double doubleValue();
//返回是否是空
bool isNULL();
private:
//文档属性对象
const tinyxml2::XMLAttribute *m_pXMLAttribute;
};
/*
* 节点类,封装对节点的各种操作.
* 如下类型节点
* <example name="ok", flag="1">text</example>
*
* example是 nodeName
* name和flag是attribute
* text是 nodeValue
*/
class WWXMLNode
{
public:
WWXMLNode(tinyxml2::XMLElement *pXMLElem);
WWXMLNode(tinyxml2::XMLElement *pXMLElem, tinyxml2::XMLDocument *pXMLDocument);
~WWXMLNode();
//增加子节点
WWXMLNode addChildNode(const char* name);
//查找子节点,默认返回第一个子节点
WWXMLNode findChildNode(const char* name = NULL);
//查找下一个兄弟节点,默认返回下面第一个兄弟节点
WWXMLNode findSlibingNode(const char* name =NULL);
//查找上一个兄弟节点,默认返回上面第一个兄弟节点
WWXMLNode preSlibingNode(const char* name = NULL);
//设置节点属性值
void setAttributeValue(const char* name, const char* value);
//获取指定的属性值
const char* getAttributeValue(const char* name);
//删除一个指定名称的属性值
void deleteAttribute(const char* name);
//设置节点名称
void setNodeName(const char* name);
//获取节点名称
const char* getNodeName();
//设置节点值
void setNodeValue(const char* value);
//获取节点值
const char* getNodeValue();
//获取属性,默认返回第一个属性
WWXMLAttribute firstAttribute(const char* name = NULL);
//删除本节点
void removeSelf();
//删除所有子节点
void removeAllChildNode();
//是否是空节点
bool isNULL();
private:
tinyxml2::XMLDocument *m_pXMLDocument;
tinyxml2::XMLElement *m_pXMLElem;
};
/*
* XML管理类,使用tinyxml2封装了操作xml的细节,需要配合WWXMLNode类使用。
* 封装了CCUserDefault提供的功能
*
* example:
* WWXMLManager myXML;
* myXML.createXMLFile("myXML.xml", "TestXMLManager");
* WWXMLNode itemNode = myXML.getXMLRootNode().addChildNode("item");
* itemNode.setAttributeValue("flag", "true");
* myXML.saveXMLFile();
*/
class WWXMLManager
{
public:
WWXMLManager();
WWXMLManager(const char* strXMLPath);
~WWXMLManager(void);
//加载xml文件,utf-8格式文件
bool loadXMLFile(const