xml文件读取
发布时间:2020-12-16 00:09:34 所属栏目:百科 来源:网络整理
导读:此处介绍的xml文件解析,采用 rapidxml,使用起来很简单,包含一个头文件 rapidxml.hpp(自行下载),就可以对xml文件进行解析: 分步解读: 1.读取xml文件数据 char * LoadModel::readFile(const char * fileName,size_t size){ FILE* file = fopen(fileName,
此处介绍的xml文件解析,采用
rapidxml,使用起来很简单,包含一个头文件rapidxml.hpp(自行下载),就可以对xml文件进行解析:
分步解读:
1.读取xml文件数据
char * LoadModel::readFile(const char * fileName,size_t& size) { FILE* file = fopen(fileName,"rb"); if (file == 0 ) { return 0; } fseek( file,SEEK_END ); size_t length = ftell( file ); fseek(file,SEEK_SET); char * buffer = new char[length + 1]; fread(buffer,1,length,file); buffer[length] = 0; size = length; fclose( file ); return buffer; } 上述代码讲述的打开命名为fileName的xml文件进行解析,通过buffer返回数据,形参size是个引用,因此能返回xml文件的大小。总而言之,该函数的功能,就是读取xml数据。
2.数据解析
<?xml version="1.0"?> <MeshRoot> <mesh name = "Box01"> <faceIndex size = "12" material ="01 - Default"> <face>0 1 2</face> <face>2 3 0</face> <face>4 5 6</face> <face>6 7 4</face> <face>0 3 5</face> <face>5 4 0</face> <face>3 2 6</face> <face>6 5 3</face> <face>2 1 7</face> <face>7 6 2</face> <face>1 0 4</face> <face>4 7 1</face> </faceIndex> <vertex size = "8"> <vertexdata>-0.500000 0.000000 0.500000 0.000000 -1.000000 0.000000 1.000000 0.000000</vertexdata> <vertexdata>-0.500000 0.000000 -0.500000 0.000000 -1.000000 0.000000 1.000000 1.000000</vertexdata> <vertexdata>0.500000 0.000000 -0.500000 0.000000 -1.000000 0.000000 0.000000 1.000000</vertexdata> <vertexdata>0.500000 0.000000 0.500000 0.000000 -1.000000 0.000000 0.000000 0.000000</vertexdata> <vertexdata>-0.500000 1.000000 0.500000 0.000000 1.000000 0.000000 0.000000 0.000000</vertexdata> <vertexdata>0.500000 1.000000 0.500000 0.000000 1.000000 0.000000 1.000000 0.000000</vertexdata> <vertexdata>0.500000 1.000000 -0.500000 0.000000 1.000000 0.000000 1.000000 1.000000</vertexdata> <vertexdata>-0.500000 1.000000 -0.500000 0.000000 1.000000 0.000000 0.000000 1.000000</vertexdata> </vertex> </mesh> </MeshRoot>
在解析之前,我们还是先来看一下,我们要解析xml文件格式,就是根节点(
MeshRoot)下有几个子节点(
mesh),子节点下又有几个子节点(
faceIndex、vertex),有个印象就好了,接下来我们来看解析用到的代码。
rapidxml::xml_document<> doc; rapidxml::xml_node<>* rootNode = 0; rapidxml::xml_node<>* meshNode = 0; rapidxml::xml_node<>* faceRoot = 0; rapidxml::xml_node<>* vertRoot = 0; doc.parse<0>(xmlData); //解析数据 rootNode = doc.first_node("MeshRoot"); //获取MeshRoot节点 if (rootNode == 0) { return false; } meshNode = rootNode->first_node(); //获取Mesh节点 if (meshNode == 0) { return false; } /// 解析面索引 faceRoot = meshNode->first_node("faceIndex"); //获取faceIndex节点 std::vector<short> arIndex; //short数组,存储解析来的数据,ex.<face>0 1 2</face> rapidxml::xml_node<>* pFaceIndex = faceRoot->first_node(); //获取获取faceIndex下的第一个节点,即<face>0 1 2</face> for ( ; pFaceIndex ; pFaceIndex = pFaceIndex->next_sibling()) //循环判断,当pFaceIndex为空,代表数据读取完毕 { const char* pzFace = pFaceIndex->value(); //将数据转换为short型,并写入数组,数据读取完毕 int a,b,c; sscanf(pzFace,"%d %d %d",&a,&b,&c); arIndex.push_back(short(a)); arIndex.push_back(short(b)); arIndex.push_back(short(c)); } /// 解析顶点数据 vertRoot = meshNode->first_node("vertex"); ...... //与解析面索引相同 delete [] xmlData;
注释已经写得明了了,大致就是这样啦!
3.全剧终
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |