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