应要求,放出读取XML文件相关的源码
2009-12-20 18:52
155 查看
地形类的源码里面关联了其他类的一些东西,其实就是XML读取的帮助类而已
TLBBFileBuffer这个类就是一个内存缓冲而已,简单说就是一个uchar的数组... 用来把2进制文件一次性读取到内存中而已.
我的代码里面只把XML类型的文件读取到内存里面,其他文件比如heightmap等,并没有用这个类来读取
TLBBFileBuffer这个类没什么东西,原理就是: DataStreamPtr mStreamPtr = ResourceGroupManager::getSingleton().openResource( name.c_str(), TLBB_RESOURCE_GROUP);
size_t mSize = mStreamPtr->size(); uchar* mBuffer = new uchar[mSize]; mStreamPtr->read(mBuffer, mSize);
然后所有二进制文件的数据,都保存在mBuffer里面载入XML文件的时候:
// 载入地形XML文件
TiXmlDocument doc;
TLBBFileBuffer fileBuffer(filename);
doc.Parse((char*)fileBuffer.GetBuffer());
GetBuffer()其实返回的就是上面的mBuffer,一个内存数组而已, doc.Parse这个函数可以直接从内存里面解析XML文件, 而Utils工具类,只是一些帮助函数而已,会XML的,自己都可以写头文件:
TLBBFileBuffer这个类就是一个内存缓冲而已,简单说就是一个uchar的数组... 用来把2进制文件一次性读取到内存中而已.
我的代码里面只把XML类型的文件读取到内存里面,其他文件比如heightmap等,并没有用这个类来读取
TLBBFileBuffer这个类没什么东西,原理就是: DataStreamPtr mStreamPtr = ResourceGroupManager::getSingleton().openResource( name.c_str(), TLBB_RESOURCE_GROUP);
size_t mSize = mStreamPtr->size(); uchar* mBuffer = new uchar[mSize]; mStreamPtr->read(mBuffer, mSize);
然后所有二进制文件的数据,都保存在mBuffer里面载入XML文件的时候:
// 载入地形XML文件
TiXmlDocument doc;
TLBBFileBuffer fileBuffer(filename);
doc.Parse((char*)fileBuffer.GetBuffer());
GetBuffer()其实返回的就是上面的mBuffer,一个内存数组而已, doc.Parse这个函数可以直接从内存里面解析XML文件, 而Utils工具类,只是一些帮助函数而已,会XML的,自己都可以写头文件:
/* ************************************************************************************************************** @fileName Utils.h @remarks TinyXML解析的帮助函数 @author LYN 2009.9.26 *************************************************************************************************************** */ #ifndef _TLBBUTILS_H_ #define _TLBBUTILS_H_ #include "TLBB.h" /* TLBBUtils类 @remarks 工具类, 把tinyXML元素转换成相应的数据类型 */ class TLBBUtils { public: /* 获得字符串*/ static String GetStringAttribute(TiXmlElement* element, const char* name); /* 获得bool值*/ static bool GetBoolAttribute(TiXmlElement* element, const char* name); /* 获得Vector3*/ static Vector3 GetVector3Attribute(TiXmlElement* element, const char* name); /* 获得Quaternion*/ static Quaternion GetQuatAttribute(TiXmlElement* element, const char* name); /* 获得ColourValue*/ static ColourValue GetColourValueAttribute(TiXmlElement* element, const char* name); /* 获得Real*/ static Real GetRealAttribute(TiXmlElement* element, const char* name); /* 获得int*/ static int GetIntAttribute(TiXmlElement* element, const char* name); /* 转换描述light类型的字符串到LightTypes枚举*/ static Light::LightTypes ConvertLightString(const String& lighttype); /* 转换描述sky类型的字符串到TLBB_SKY_TYPE枚举*/ static TLBB_SKY_TYPE ConvertSkyString(const String& skytype); /* 获得场景类型*/ static TLBB_NODE_TYPE GetNodeType(TiXmlElement* element); /* 获得地形类型*/ static TLBB_TERRAIN_TYPE GetTerrainType(TiXmlElement* element); /* 获得对象类型*/ static TLBB_OBJ_TYPE GetObjType(TiXmlElement* element); /* UTF8到多字节*/ static void Utf8ToAscii(char* szUtf8, char* outAscii); }; #endif
#include "stdafx.h" #include "Utils.h" //-------------------------------------------------------------------------------------------------------------- String TLBBUtils::GetStringAttribute(TiXmlElement* element, const char* name) { const char* value = element->Attribute(name); if (value != NULL) { return value; } else { return StringUtil::BLANK; } } //-------------------------------------------------------------------------------------------------------------- Vector3 TLBBUtils::GetVector3Attribute(TiXmlElement* element, const char* name) { const char* value = element->Attribute(name); Vector3 vec; if (value != NULL) { String str = value; size_t pos = str.find_first_of(' ', 0); size_t pos2 = str.find_first_of(' ', pos+1); String x = str.substr(0, pos); String y = str.substr(pos+1, pos2); String z = str.substr(pos2+1, str.length()); vec.x = StringConverter::parseReal(x); vec.y = StringConverter::parseReal(y); vec.z = StringConverter::parseReal(z); } return vec; } //-------------------------------------------------------------------------------------------------------------- Quaternion TLBBUtils::GetQuatAttribute(TiXmlElement* element, const char* name) { const char* value = element->Attribute(name); Quaternion quat; if (value != NULL) { String str = value; size_t pos = str.find_first_of(' ', 0); size_t pos2 = str.find_first_of(' ', pos+1); size_t pos3 = str.find_first_of(' ', pos2+1); quat.w = StringConverter::parseReal(str.substr(0, pos)); quat.x = StringConverter::parseReal(str.substr(pos+1, pos2)); quat.y = StringConverter::parseReal(str.substr(pos+2, pos3)); quat.z = StringConverter::parseReal(str.substr(pos3+1, str.length())); } return quat; } //-------------------------------------------------------------------------------------------------------------- ColourValue TLBBUtils::GetColourValueAttribute(TiXmlElement* element, const char* name) { const char* value = element->Attribute(name); ColourValue color; if (value != NULL) { String str = value; size_t pos = str.find_first_of(' ', 0); size_t pos2 = str.find_first_of(' ', pos+1); String x = str.substr(0, pos); String y = str.substr(pos+1, pos2); String z = str.substr(pos2+1, str.length()); color.r = StringConverter::parseReal(x); color.g = StringConverter::parseReal(y); color.b = StringConverter::parseReal(z); } return color; } //-------------------------------------------------------------------------------------------------------------- Real TLBBUtils::GetRealAttribute(TiXmlElement* element, const char* name) { const char* value = element->Attribute(name); Real v = -1; if (value != NULL) { String str = value; v = StringConverter::parseReal(str); } return v; } //-------------------------------------------------------------------------------------------------------------- int TLBBUtils::GetIntAttribute(TiXmlElement* element, const char* name) { const char* value = element->Attribute(name); int v = 0; if (value != NULL) { String str = value; v = StringConverter::parseInt(str); } return v; } //-------------------------------------------------------------------------------------------------------------- Light::LightTypes TLBBUtils::ConvertLightString(const String& lighttype) { if (lighttype == "directional") { return Light::LT_DIRECTIONAL; } else { return Light::LT_POINT; } } //-------------------------------------------------------------------------------------------------------------- bool TLBBUtils::GetBoolAttribute(TiXmlElement* element, const char* name) { const char* value = (char*)element->Attribute(name); bool b = false; if (value != NULL) { String str= value; b = StringConverter::parseBool(str); } return b; } //-------------------------------------------------------------------------------------------------------------- TLBB_SKY_TYPE TLBBUtils::ConvertSkyString(const String& skytype) { if (skytype == "SkyDome") { return TYPE_SKYDOME; } else if (skytype == "SkyBox") { return TYPE_SKYBOX; } else if (skytype == "SkyPlane") { return TYPE_SKYPLANE; } else { return (TLBB_SKY_TYPE)-1; } } //-------------------------------------------------------------------------------------------------------------- TLBB_NODE_TYPE TLBBUtils::GetNodeType(TiXmlElement* element) { String type = element->Value(); if (type == "Scene") { return NODE_SCENE; } else if (type == "Terrain") { return NODE_TERRAIN; } else if (type == "Object") { return NODE_OBJECT; } else { return NODE_UNKNOWN; } } //-------------------------------------------------------------------------------------------------------------- TLBB_TERRAIN_TYPE TLBBUtils::GetTerrainType(TiXmlElement* element) { String type = element->Value(); if (type == "scale") { return TERRAIN_SCALE; } else if (type == "centre") { return TERRAIN_CENTRE; } else if (type == "heightmap") { return TERRAIN_HEIGHTMAP; } else if (type == "gridInfo") { return TERRAIN_GRIDINFO; } else if (type == "lightmap") { return TERRAIN_LIGHTMAP; } else if (type == "textures") { return TERRAIN_TEXTURES; } else if (type == "pixmaps") { return TERRAIN_PIXMAPS; } else if (type == "materials") { return TERRAIN_MATERIALS; } else { return TERRAIN_UNKNOWN; } } //-------------------------------------------------------------------------------------------------------------- TLBB_OBJ_TYPE TLBBUtils::GetObjType(TiXmlElement* element) { String type = element->Value(); if (type != "Object") { return OBJ_UNKNOWN; } type = TLBBUtils::GetStringAttribute(element, "type"); if (type == "Enviroment") { return OBJ_ENVIRONMENT; } else if (type == "Light") { return OBJ_LIGHT; } else if (type == "SkyDome") { return OBJ_SKYDOME; } else if (type == "StaticEntity") { return OBJ_STATICENTITY; } else if (type == "Model") { return OBJ_MODEL; } else if (type == "ParticleSystem") { return OBJ_PARTICLESYSTEM; } else if (type == "TerrainLiquid") { return OBJ_TERRAINLIQUID; } else { return OBJ_UNKNOWN; } } //------------------------------------------------------------------------------------------------------------------ void TLBBUtils::Utf8ToAscii(char* szUtf8, char* outAscii) { // 得到UTF8编码的字符串长度 int nLen = MultiByteToWideChar(CP_UTF8, 0, szUtf8, -1, NULL, NULL); LPWSTR lpwsz = new WCHAR[nLen]; MultiByteToWideChar(CP_UTF8, 0, szUtf8, -1, lpwsz, nLen); int nLen1 = WideCharToMultiByte(CP_ACP, 0, lpwsz, nLen, NULL, NULL, NULL, NULL); LPSTR lpsz = new CHAR[nLen1]; WideCharToMultiByte(CP_ACP, 0, lpwsz, nLen, lpsz, nLen1, NULL, NULL); strncpy(outAscii, lpsz, nLen1); delete lpsz; delete lpwsz; }
相关文章推荐
- asp.net读取xml文件相关内容
- xml相关概念及java读取配置文件
- Hadoop如何读取复杂格式的文件,例如XML、HTML、图像等,附源码
- 读取xml文件转成List<T>对象的两种方法(附源码)
- 读取xml文件转成List<T>对象的两种方法(附源码)
- Spring源码解析——配置文件读取相关的类
- JAXB读取包含有CDATA的XML文件及相关异常解决
- android 实用sax 读取xml文件内容 附源码
- Mybatis源码分析-读取非项目中的xml文件
- [drp 3]读取Xml配置文件,连接数据库
- 用JAVA读取XML文件
- HOW TO:使用 Visual C# .NET 从文件中读取 XML
- 用VBA读取Excel表格输出到格式化的xml文件中
- Python解析大XML文件及读取XML不全的问题
- JDOM 读取xml文件中的CDATA数据
- 如何使用opencv的c++接口来读取、写结构体数组到xml文件中
- Servlet读取web.xml配置文件
- java:利用Dom读取xml文件
- 读取、回收和重用:使用 Excel、XML 和 Java 技术轻松搞定报告使用 Java 和 XML 技术读取 Excel 文件并写入新文件(1)