xml文件读取
来源:互联网 发布:淘宝天猫商城费用 编辑:程序博客网 时间:2024/06/05 16:52
此处介绍的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, 0, SEEK_END ); size_t length = ftell( file ); fseek(file, 0, 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.全剧终
0 0
- SAX 读取xml文件
- xml文件读取
- 读取xml文件内容
- 读取xml 文件
- JAVA读取XML文件
- 读取远程xml文件
- XML文件的读取
- Xml文件的读取
- JAVA读取XML文件
- 读取XML文件
- flash读取xml文件
- C#读取XML文件
- javascript 读取XML文件
- 读取xml 文件
- XML文件的读取
- 读取XML文件
- JAVA读取XML文件
- JAVA读取XML文件
- Python learning note
- android 应用程序中重启系统的方法
- 核心动画 CoreAnimation 详解 【推荐】
- SHU1757 村村通工程(第二种算法:Dijkstra算法)
- jquery 自动补全插件 autocomplete
- xml文件读取
- VMware Workstation虚拟机启动故障总结
- 关于Android APP的打包和加固
- 基于spark的网络爬虫实现
- GitHub从fork到pull request之基础流程
- Activity 中 finish() 、onDestroy() 和System.exit()的区别
- 1003:Crashing Balloon
- Centos里tftp服务器的安装和配置
- Hive 体系架构