一、库安装(MinGW)
- 直接在boost网站上下载解压,并将boost_1_67内的boost文件夹复制到MinGW的include文件夹下即可
- 下载官网地址: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" ),即将其变为引用,从而实现地址传递,而不是数据拷贝。