stl解析xml

发现xml存储,查看方便。所以想用用它,但是解析它不太容易。我用C++自带的string类 勉强实现了这一功能。

我生成了这样一串xml:(carinfo.xml)

<carnode><id>0</id><time>11:32</time><event>这家伙违章了!</event></carnode>
<carnode><id>1</id><time>11:32</time><event>这家伙违章了!</event></carnode>
<carnode><id>2</id><time>11:32</time><event>这家伙违章了!</event></carnode>
<carnode><id>3</id><time>11:32</time><event>这家伙违章了!</event></carnode>
<carnode><id>4</id><time>11:32</time><event>这家伙违章了!</event></carnode>

<car></car>里面代表了一辆车,里面是它的元素。

大致思路是这样: 先把这一文件转换为string类型,string 类型里有find() ,rfind(),erase() 方法,从尾到头的

解析,解析一个节点,马上删除一个节点,这样每次循环只要处理最后一个节点,简化处理。

int main()
{
   //定义元素分隔符
   const char node_starter[15] = "<carnode>";
   const char node_ender[15] = "</carnode>";
   const char id_starter[15] = "<id>";
   const char id_ender[15] = "</id>";
   const char time_starter[15] = "<time>";
   const char time_ender[15] = "</time>";
   const char event_starter[15] = "<event>";
   const char event_ender[15] = "</event>";
//解析xml文件,要能给出节点的个数 ,需要字符串匹配 
   //一次解析一个节点,然后文件指针指向下一个节点,直到没有了节点 
   //对于每个节点里面, 
   FILE* inputxml = fopen( "carinfo.xml" , "rb" ); //打开一个只读asic文件 
   //利用强大的STL 
   vector<char> c_vector;
   //从文件读入字符到向量 
   while( !feof( inputxml ) )
   {
       char temp_char = fgetc( inputxml );
       c_vector.push_back( temp_char );           
   }
   fclose(inputxml);   
   
   char c_array[ c_vector.size() ];
   int index = 0;
   //从向量中取出字符到数组,并加上结束标志 
   for(vector<char>::iterator it = c_vector.begin();it != c_vector.end();it++)
   {
       c_array[ index ] = *it;  
       if(index == ( c_vector.size() - 1 ) )
       {
           c_array[ index ] = '\0';
       }       
       index++;                  
   }
   string file_copy( c_array );
   cout<<"test:: the file string is:\n"<<file_copy<<endl;
   unsigned int node_count = 0;
   //有了string类型,字符串匹配就方便了 
   //每次循环找最后一对<carnode></carnode>,找到就删除,再找下一对,这样就能得到节点的个数
   //结束标志 :长度为0 
   while(file_copy.size()>1)
   {
        node_count++;
        int last_carnode_starter_position = file_copy.rfind( node_starter );  
           //在这里就只需要慢慢的解析一个节点的元素了 
           string event_string;
           parseElement( event_starter , event_ender , file_copy , event_string);
           cout<< "the event:" << event_string << "<|>" ;
           string time_string;
           parseElement( time_starter , time_ender , file_copy , time_string);
           cout<<"the time:"<<time_string<<"<|>";
           string id_string;
           parseElement( id_starter , id_ender , file_copy , id_string);
           cout<<"the id:"<<id_string<<endl;
         
        file_copy.erase( last_carnode_starter_position );                     
   }  
   cout<<"the node number is: "<<node_count<<endl;
   system( "PAUSE" ); 
   return 1;
}

/*************
 解析一个节点里的某个元素
 parameter:
           starter
           ender
           file_string
           result 
 里面的数学关系搞对就行,所以就不多注释 
*************/
bool parseElement(const char* starter,const char* ender,const string file_string,string& result)
{
   short starter_position = file_string.rfind( starter ); 
   short ender_position = file_string.rfind( ender ); 
   short result_string_size = ender_position - ( starter_position + strlen( starter ) );
   char result_storage[ result_string_size + 1];
   for(short index = 0;index < result_string_size ;index++)
   {
       result_storage[ index ] = file_string[ starter_position + strlen( starter ) + index]; 
   }
   result_storage[ result_string_size ] = '\0';
   result=string(result_storage);
}
string 能支持4G的长度,我想这样一般的需求还是能满足的,不必用第三方库了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值