• Boost xml解析之菜鸟版


    1.准备工作:

    环境: visual studio 2010 /boost:boost_1_54_0

    新建Application什么的不做赘述,但是注意 如果需要引用Boost库中的lib 需要在属性properties的VC++ Directories中的Include Directories 中加入Boost的路径

    待解析xml文件:

    text.xml

    复制代码
    <students>
       <student id="1">
          <name>张三</name>
          <age>18</age>
          <sex></sex>
       </student>
       <student id="2">
          <name>李娟</name>
          <age>22</age>
          <sex></sex>
       </student>
       <student id="3">
          <name>王强</name>
          <age>21</age>
          <sex></sex>
       </student>
       <student id="4">
          <name>李四</name>
          <age>25</age>
          <sex></sex>
       </student>
       <student id="5">
          <name>姚娜</name>
          <age>19</age>
          <sex></sex>
       </student>
       <student id="6">
          <name>程乐</name>
          <age>21</age>
          <sex></sex>
       </student>
    
    </students>
    复制代码

    整个程序:

    <br>#include <boost/property_tree/ptree.hpp> 
    #include <boost/property_tree/xml_parser.hpp> 
    #include <boost/typeof/typeof.hpp>
    #include <iostream>
    #include <exception>

    int main()

    {  

    using boost::property_tree::ptree;

    ptree pt; 

    try  {    

      read_xml("text.xml",pt); 

    BOOST_AUTO(child,pt.get_child("students"));

      for(BOOST_AUTO(pos,child.begin());pos!=child.end();++pos)

         std::cout<<pos->second.get<int>("<xmlattr>.id")<<" "<<pos->second.get<std::string>("name")<<" "<<pos->second.get<std::string>("sex")<<std::endl; 

        // system("pause");测试时用,可以让程序暂时停在此处

    }

    catch (std::exception& e)

    {

      std::cout<<"Error:"<<e.what()<<std::endl;  

    return -1; 

    }

    }

    结果:

    2.解析流程

    a.读入xml文件

    readxml("text.xml");
    //注意:这是默认text.xml文件保存在项目文件的根目录下下,即在硬盘中与主程序文件在同一目录下,当然也可以放在其他目录,但别忘了是双斜杠  位于头文件#include <boost/property_tree/xml_parser.hpp>  </span>

    b.获取子节点

    BOOST_AUTO(child,pt.get_child("students"));
    //注意:这里的BOOST_AUTO实质上是一个宏,在头文件#include <boost/typeof/typeof.hpp>中定义,功能说白了就是赋值操作,可以说就是C++ 11中Auto的boost版本,这里定义了一个变量child,并将pt.get_child("students")的值赋给child,<br>这里为什么要用BOOST_AUTO,实质上是对数据类型的一个泛化,使得用户不用去深究pt.get_child("students")到底是什么类型,而把重点放在其操作上。详见C++ 11中auto(配合template将是大杀器)<br>位于头文件#include <boost/typeof/typeof.hpp></span>

    c.读取属性或节点内容

    for(BOOST_AUTO(pos,child.begin());pos!=child.end();++pos) //现在看出了BOOST_AUTO的好处了吧。</span><br>  { 
           std::cout<<pos->second.get<int>("<xmlattr>.id")<<" "<<pos->second.get<std::string>("name")<<" "<<pos->second.get<std::string>("sex")<<std::endl;
           

    此处的pos为节点的迭代器,在本文中即遍历student节点,此处你可以将pos(迭代器)->second.get<T(类型)>(path)认为是解析的固定方法。注意此处的path.获取节点内容时直接以点分隔,例如:path="students.student.....";若是求属性,则加上<xmlattr>

  • 相关阅读:
    css3 练习
    onethink 返回上一页
    小程序之轮播图
    Node 基本使用
    IDEA Terminal
    Spring Shell简单应用
    Spring Theme简单应用
    Spring MVC的学习笔记
    Win10出现键盘未失灵,按下的键都是快捷键的问题
    SQL Server 添加描述
  • 原文地址:https://www.cnblogs.com/ainima/p/6331294.html
Copyright © 2020-2023  润新知