boost/property_tree/ptree读写xml全整理

一、库安装(MinGW)

  1. 直接在boost网站上下载解压,并将boost_1_67内的boost文件夹复制到MinGW的include文件夹下即可
  2. 下载官网地址:Boost C++ Libraries

二、头文件

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>

三、文件操作函数

3.1 读文件函数

void boost::property_tree::read_xml(
        basic_stream &stream, 
        ptree &pt, 
        const int flag = 0)
void boost::property_tree::read_xml(
        const std::string filename, 
        ptree &pt, 
        const int flag = 0, 
        const std::locale &loc = std::locale())

        比较常用的是第二个函数,因为它的第一个参数是文件的名字,第二个参数是一个ptree对象,也就是读取完后的数据所保存成的对象,最后一个是locale对象,它规定了数据格式,如日期、换行、编码等等,一般可以默认,详见C++ 标准库的 locale 类用法_c++中paraloc怎么用-CSDN博客

        值得注意的是第三个参数int flag,它实际上是对xml中标签以外的文字进行操作的一个参数,它可以取值0,1,2,4,其中0表示不进行任何操作,其它值都已经在如下代码中预置

const int boost::property_tree::xml_parser::no_concat_text = 1; //不连接文字
const int boost::property_tree::xml_parser::no_comments = 2; //去除注释
const int boost::property_tree::xml_parser::trim_whitespace=4;//去除多余的换行和空格等

使用样例:

using boost::property_tree::ptree;
ptree pt;
read_xml("sample_in.xml", pt, 4);

3.2 写文件函数

void boost::property_tree::write_xml(
        basic_stream &stream, 
        ptree &pt, 
        const xml_writter_settings &settings = xml_settings());

void boost::property_tree::write_xml(
      const std::string filename, 
      ptree &pt, 
      const std::local &loc = std::locale(),
      const xml_writter_settings &settings = xml_settings());

        这两个函数也是第二个比较常用,原因同样是因为第一个参数是文件名,第二个参数是ptree对象,第三个参数是环境变量数据格式,如日期、换行、编码等等。

     值得注意的第四个参数,它是一个对xml文件自动设置一些缩进等等操作,具体可以设置需要通过如下函数生成boost::property_tree::xml_writter_settings 对象:

template <class Str> xml_writer_settings<Str> xml_writer_make_settings<Str>(
        Str::value_type ch = (Str::value_type)' ',
        Str::size_type count = 0,
        const Str &encoding = widen<Str>("UTF-8")
        );

        这个函数生成的对象,对让对xml输出时,在适合的缩进位置填充count数量的ch字符,编码格式为encoding,默认为UTF-8。

使用样例:

boost :: property_tree :: xml_writer_settings< std::string > settings;
settings = boost :: property_tree :: xml_writer_make_settings< std::string >(' ', 4);
write_xml( "sample_out.xml", pt, std::locale(), settings );

3.3 其它文件操作函数

        boost库中对xml的文件操作函数都在boost::property_tree::xml_parser中,因为平时没有用到,所以小某还没有考察,只列举如下:

boost::property_tree::xml_parser::read_xml
boost::property_tree::xml_parser::read_xml_internal
boost::property_tree::xml_parser::read_xml_node
boost::property_tree::xml_parser::write_xml
boost::property_tree::xml_parser::write_xml_comment
boost::property_tree::xml_parser::write_xml_element
boost::property_tree::xml_parser::write_xml_indent
boost::property_tree::xml_parser::write_xml_internal

四、内存操作函数

4.1 查询条目函数

        查询函数都在boost::property_tree::ptree下,并且名称中都含有关键字get,常用的两个函数如下:

template <class Str> Str boost::property_tree::ptree::get<Str>( std::string path );

template <class Str> 
boost::property_tree::ptree& boost::property_tree::ptree::get_child<Str>( std::string path );

        其中 path是xml中用“.”号连接的标签路径。第一个函数是获取该路径下的内容,第二个函数是获取该路径下的子标签并返回一个新的ptree。特别要注意的一点是,如果该路径不存在或无法取得返回值,则代码会直接抛出异常,如果没有异常处理块,则不能编译通过。

        另外,第二个函数返回的是一个引用,这个引用所指向的内存块就在原来的父级ptree的内存块上。

4.2 增加条目函数

        增加条目函数都在boost::property_tree::ptree下,并且有add和put两类,其中add类函数是将新数据追加末尾,put类函数是用新数据重名覆盖。常用函数如下:

using boost::property_tree::ptree;

ptree& ptree::add_child( std::string path, ptree& pT);

ptree& ptree::put_child( std::string path, ptree& pT);

        其中,第一行代码仅仅是为了简化对ptree的导入使用。pT是要追加的数据,path是追加数据的指定路径。

4.3 删除条目函数

        删除函数有四个,列举如下:

using boost::property_tree::ptree;

void ptree::clear();//清空
void ptree::erase(std::string tag);//删除下一级中,所有名字为tag的子ptree
void ptree::pop_front();//删除第一个子ptree
void ptree::pop_back();//删除最后一个子ptree

        其中,第一行代码仅仅是为了简化对ptree的导入使用。相关函数的功能在注释中已经表达清楚。值得注意的是,erase函数中的参数只能是一个tag的名,而不能是一个路径。

五、其它

5.1 迭代器

        boost指供了自动类型的宏BOOST_AUTO(),使用起来非常方便,此外还指代了iterator begin()iterator end()函数,这使得迭代函数很容易进行。

        使用样例:

using boost::property_tree::ptree;

ptree pT;
boost::property_tree::xml_parse::read_xml(pT,"sample_file.xml");

for(BOOST_AUTO(pos,pT.begin());pos != pT.end();++pos)
{
    std::cout<<pos->first.data()<<" "<<pos->second.data()<<std::endl;
}

5.2 典型错误

//在pT中的路径root.first.second下增加n_pT, 以下代码不能实现

using boost::property_tree::ptree;

ptree pT, n_pT;
boost::property_tree::xml_parse::read_xml(pT, "sample_file.xml");

ptree sub_pT = pT.get_child( "root.first" );

//ptree& sub_pT = pT.get_child( "root.first" );

sub_pT.add_child( "second", n_pT );

原因:ptree sub_pT = pT.get_child( "root.first" )一行中,"="在ptree类已经进行了重构,它会拷贝并生成新的ptree,因而使得后续代码的增加操作不能实现所要实现的效果。

修正方法:将此句修改为ptree& sub_pT = pT.get_child( "root.first" ),即将其变为引用,从而实现地址传递,而不是数据拷贝。

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值