关于 Boost.PropertyTree

  • Home
  • 关于
Browse: Home / Boost / 关于 Boost.PropertyTree

关于 Boost.PropertyTree

By 自言自语 on February 28, 2010

Boost.PropertyTree 应该是 Boost 1.41.0 开始正式加入 Boost 版本的。目前 ( 2010/02/28 ) 能下到的最新版本是 1.42.0。


  • 主要作用/应用场合

Boost.PropertyTree 提供了一种结构化的数据存储容器。并且提供了一系列的解释器可以将内存中的结构与具体格式相互转换 (比如: INI, XML, JSON )。

至少可以用在:

  1. 进程间通讯或者跨语言的进程间的通讯
  2. 一些配置文件的存取
  3. 网络通讯协议的格式

  • 基本用法

基本用法有 2 种场景。第一种是从 Property Tree存储到具体格式。第二种是从具体格式解析到具体的 Property Tree。其他还有一些 Property Tree 操作的方法,比如:遍历、搜索等方法。

以下这个 Sample 就是基本用法的测试:

先把 数据存储到 datum 中,随后输出 相应的 XML 和 JSON 到 std::cout 上。最后再从 JSON Stream 中解析输入到 ptParse 中获得相应 的数据。

#include <stdio.h>#include <iostream>
#include <sstream>
#include <string>
#include <locale>#include "boost/property_tree/ptree.hpp"
#include "boost/property_tree/json_parser.hpp"
#include "boost/property_tree/xml_parser.hpp"int main(int argc, char **argv)
{/* The data format* <root>*  <num>1</num>*  <str>Test</str>* </root>*/try{/* create the property tree */boost::property_tree::ptree datum;datum.put("root.num", 100);datum.put("root.str", "string");/* output XML string */std::ostringstream xmlOutputStream;boost::property_tree::xml_parser::write_xml(xmlOutputStream,datum);std::cout << "XML format:" << std::endl;std::cout << xmlOutputStream.str() << std::endl;/* output JSON string */std::ostringstream jsonOutputStream;boost::property_tree::json_parser::write_json(jsonOutputStream,datum);std::cout << "JSON format:" << std::endl;std::cout << jsonOutputStream.str() << std::endl;/* read datum from JSON stream */boost::property_tree::ptree ptParse;std::istringstream jsonIStream;jsonIStream.str(jsonOutputStream.str());boost::property_tree::json_parser::read_json(jsonIStream,ptParse);int num = ptParse.get<int>("root.num");std::string strVal = ptParse.get<std::string>("root.str");std::cout << "Num=" << std::dec << num<< " Str=" << strVal << std::endl << std::endl;}catch (...){printf("create boost::property_tree::ptree failed\n");}return 0;
}

  • 关于字符集

Boost 目前是支持 UTF8 的,但是不能用 直接用 Unicode。所以,如果要存储宽字符就有点麻烦需要用到 Boost 提供的 utf8_codecvt_facet 做转换。

下面就是一个存储 wchar_t 的 Sample:

和之前的其实差不多,有 2 点主要不同。一是用了 wptree 替换了 ptree。二是增加了 utf8_codecvt_facet 在相应的 Stream 里做转换。

 
#include <stdio.h>#include <iostream>
#include <sstream>
#include <string>
#include <locale>#include "boost/property_tree/ptree.hpp"
#include "boost/property_tree/json_parser.hpp"
#include "boost/property_tree/xml_parser.hpp"#include "boost/program_options/detail/convert.hpp"
#include "boost/program_options/detail/utf8_codecvt_facet.hpp"int main(int argc, char **argv)
{/* The data format* <root>*  <num>1</num>*  <str>Test</str>* </root>*//* test UTF-8 format */try{/* create boost utf8 codecvt */std::locale oldLocale;std::locale utf8Locale(oldLocale,new boost::program_options::detail::utf8_codecvt_facet());std::wcout.imbue(utf8Locale);/* create the wptree for save the UTF-8 data */boost::property_tree::wptree datum;datum.put(L"root.num", 100);datum.put(L"root.str", L"wstring");/* output XML string */std::wostringstream xmlOutputStream;xmlOutputStream.imbue(utf8Locale);boost::property_tree::xml_parser::write_xml(xmlOutputStream,datum);std::wcout << L"XML format:" << std::endl;std::wcout << xmlOutputStream.str() << std::endl;/* output JSON string */std::wostringstream jsonOutputStream;jsonOutputStream.imbue(utf8Locale);boost::property_tree::json_parser::write_json(jsonOutputStream,datum);std::wcout << L"JSON format:" << std::endl;std::wcout << jsonOutputStream.str() << std::endl;/* read datum from JSON stream */boost::property_tree::wptree wptParse;std::wistringstream jsonIStream;jsonIStream.imbue(utf8Locale);jsonIStream.str(jsonOutputStream.str());boost::property_tree::json_parser::read_json(jsonIStream,wptParse);int num = wptParse.get<int>(L"root.num");std::wstring wstrVal = wptParse.get<std::wstring>(L"root.str");std::wcout << L"Num=" << std::dec << num<< L" Str=" << wstrVal << std::endl << std::endl;}catch (...){printf("create boost::property_tree::wptree failed\n");}return 0;
}

  • 附录
  1. 以上的测试程序,在 Boost 1.42.0 和 MS VS 2008 上测试过。这里是打包文件 PTreeTest
  2. 在 Boot.org 上能找到更多的 PropertyTree 的操作。PropertyTree 在 Boost 1.41.0 版本的手册。最好去看新版本的如果以后更新的话。
  3. Boot.PropertyTree 用的 XML 解析器是 RapidXML 。是一个基于模板设计的 XML 操作库 ,有非常好的性能(据说)。

Posted in Boost | Tagged Boost, Programming, 代码民工

2 responses to “关于 Boost.PropertyTree”

  1. cheating wife

    January 17, 2013 at 1:21 pm | Permalink

    I realized my girldfriend cheating on me while using various other babe at PlayerBlock

  2. small things

    March 11, 2013 at 6:22 am | Permalink

    I hardly leave a response, but i did some searching and
    wound up here 关于 Boost.PropertyTree. And
    I do have some questions for you if you don’t mind. Could it be just me or does it look as if like some of the responses appear like they are coming from brain dead visitors? And, if you are posting at additional online sites, I would like to keep up with everything fresh you have to post. Would you list of every one of your social sites like your linkedin profile, Facebook page or twitter feed?

Leave a Reply

关于 Boost.PropertyTree相关推荐

  1. Boost.PropertyTree 属性树的简介

    该库的中心组件是basic_ptree类模板.该类的实例是属性树. 对 key 和 data_type进行参数化; 总之,就是,模版编程那一套 ptree, wptree, iptree和wiptre ...

  2. C/C++字符串处理库

    作者:网事如风 链接:https://www.zhihu.com/question/28887335/answer/42489741 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  3. C/C++ 开源库及示例代码

    C/C++ 开源库及示例代码 Table of Contents 说明 1 综合性的库 2 数据结构 & 算法 2.1 容器 2.1.1 标准容器 2.1.2 Lockfree 的容器 2.1 ...

  4. 配置文件的读取-TOML

    前言 在C++的项目中,我们可以选择使用哪种配置文件?选择配置文件的两个依据可能是: 配置数据本身的复杂性. 应用程序的编程语言是否具有用于解析文件格式的现有强大库 具体可参考:Config File ...

  5. Linux下安装 boost 库

    1. 先去官网下载压缩包: https://www.boost.org/ 2. 解压后cd 进入根目录,然后执行: ./bootstrap.sh 3. 安装(时间会很长): ./b2 install ...

  6. Mysql依赖库Boost的源码安装,linux下boost库的安装

    boost'准标准库'安装过程. 安装的是boost_1_60_0. (1)首先去下载最新的boost代码包,网址www.boost.org. (2)进入到自己的目录,解压: bzip2 -d boo ...

  7. 函数指针amp;绑定: boost::functoin/std::function/bind

    see link: https://isocpp.org/wiki/faq/pointers-to-members function vs template: http://stackoverflow ...

  8. Boost 1.53.0 发布,可移植的C++标准库

    Boost 1.53.0 发布了,包含了 5 个新的库,修复了一些安全漏洞以及 Boost.Locale 组件的 bug . 新增的 5 个库包括: Boost.Atomic Boost.Corout ...

  9. cmake开发环境 linux qt_一步步搭建CMake+QT+VTK+BOOST开发环境

    开发环境: 1.可以迅速处理大量并发网络数据包,ASIO库和winpcap 4.1.3库; 2.处理与显示点云模型数据,使用VTK 8.2.0库; 3.项目使用CMake+VC2017编译,GUI使用 ...

最新文章

  1. js 判断js,css是否引入,确保不重复引入
  2. 20165204 第十周课下作业补做
  3. 【数字信号处理】相关函数与线性卷积关系 ( 卷积概念 | 相关函数概念 | 相关函数与线性卷积对比 | x(-m) 共轭 与 y(m) 的卷积就是两个信号 位移 m 的相关函数 )
  4. vlookup查找值不唯一时怎么办
  5. AbstractReferenceCountedByteBuf源码分析
  6. 推荐一个最近开源的Matting工具箱
  7. linux上部署javaWeb项目
  8. 下标 获取字符_互联网人工智能编程语言Python的下标与切片详解
  9. Android下拉状态栏图标错了,小米手机怎么改状态栏的图标,并且把下拉的状态栏弄透明...
  10. 中国摊铺机(车辆)市场趋势报告、技术动态创新及市场预测
  11. 杨辉三角c语言if 编程,杨辉三角_用c语言怎么编程
  12. Java旅游网站源码+页面
  13. 搜索题集整理(DFSBFS)
  14. 印度官方语言有几种_印度货币上有17种语言,你知道每种语言有多少人在用吗?...
  15. 干货|TPM管理系列之六源改善
  16. 随机数生成器python_python安全开发军规之四:使用安全的随机数生成器
  17. 创业公司一年工作总结(转)(公司失败原因)
  18. 5-ipv6服务器之-dns
  19. Jenkins Windons下安装ChangeLog插件获取Git更新日志
  20. qlv视频格式怎么转换成常用的mp4格式

热门文章

  1. gitlab 修改git clone地址为指定域名
  2. [P2387魔法森林
  3. bzoj 4278 [ONTAK2015]Tasowanie——后缀数组
  4. eclipse 保存html 提示 save could not be completed
  5. 通过Redis、Memcache的 incr 原子操作防刷机制的使用差别
  6. Unity之流光效果
  7. 后端接口的幂等性(转)
  8. 播放视频比较好的框架
  9. 【爬虫】beautiful soup笔记(待填坑)
  10. [deviceone开发]-毛玻璃效果示例