xml文件读取

    此处介绍的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.全剧终

你可能感兴趣的:(xml文件读取)