C++ Boost库:使用property_tree解析XML和JSON
文章目录1. C++中解析XML文件2. property_tree库简介3. property_tree 解析XML示例代码4. C++中解析JSON文件5. property_tree 解析JSON示例代码1. C++中解析XML文件在项目中C++读取和设置XML配置文件是最常用的操作,以下是常用的几个的XML解析器:TinyXML是一个简单的开源的解析XML的解析库(DOM模型)。Rapid
文章目录
C++ Boost库:简介和第一个示例程序
C++ Boost库:数值转换 lexical_cast
C++ Boost库:字符串格式化 format
C++ Boost库:字符串string_algo
C++ Boost库:字符串算法string_algo
C++ Boost库:类型推导BOOST_AUTO/BOOST_TYPEOF
C++ Boost库:分词处理库 tokenizer
C++ Boost库:windows下编译Boost库
C++ Boost库:日期时间库 date_time
C++ Boost库:智能指针scoped_ptr
C++ Boost库:数组智能指针 scoped_array
C++ Boost库:共享所有权的智能指针 shared_ptr
C++ Boost库:工厂函数 make_shared
C++ Boost库:共享有权的数组智能指针shared_array
C++ Boost库:弱引用智能指针 weak_ptr
C++ Boost库:禁止拷贝 nocopyable
C++ Boost库:计时器 timer
C++ Boost库:普通数组array
C++ Boost库:散列容器 unordered_set、unordered_multiset
C++ Boost库:散列容器 unordered_map、unordered_multimap
C++ Boost库:双向映射容器 bimap
C++ Boost库:环形缓冲区 circular_buffer
C++ Boost库:动态多维数组 multi_array
C++ Boost库:使用property_tree解析XML和JSON
C++ Boost库:简化循环 BOOST_FOREACH
C++ Boost库:随机数库 Random
C++ Boost库:引用库 ref
C++ Boost库:绑定库 bind
C++ Boost库:线程库 thread 跨平台多线程
C++ Boost库:互斥量 mutex
1. C++中解析XML文件
在项目中C++
读取和设置XML
配置文件是最常用的操作,以下是常用的几个的XML
解析器:
TinyXML
是一个简单的开源的解析XML
的解析库(DOM
模型)。RapidXml
是一个使用C++
编写的XML DOM
懈解析工具包,整个解析工具包包含在一个头文件中,所以使用时不用编译也不用连接。只要包含rapidxml
中的三个头文件即可。Xerces-C++
是Apache
组织所推动的一项XML文档解析开源项目,通过DOM
、SAX
等方式解析。libXML
是一个用于解析xml
文件的库,在各个平台下都能使用,也支持多种语言,如C
、Python
等
2. property_tree库简介
Boost
库中的 property_tree
库是个保存了多个属性值的树形数据结构,可以很方便的解析或生成xml
、json
、ini
、info
文件。property_tree
库的核心类是 basic_ptree
。
使用需要包含头文件:
#include<boost/property_tree/ptree.hpp>
#include<boost/property_tree/xml_parser.hpp>
命名空间:
using namespace boost::property_tree;
3. property_tree 解析XML示例代码
test.xml
<?xml version="1.0" encoding="gb2312"?>
<stu>
<name id="1000">小明</name>
<age>18</age>
<score>8.23</score>
<lesson>
<name>语文</name>
<name>数学</name>
</lesson>
</stu>
main.cpp
#include<boost/property_tree/ptree.hpp>
#include<boost/property_tree/xml_parser.hpp>
using namespace boost::property_tree; //名字空间
#include<iostream>
using namespace std;
int main()
{
try
{
//定义 basic_ptree<std::string, std::string> 的对象
ptree pt;
//读取xml文件
xml_parser::read_xml("test.xml", pt);
//写入xml文件
//write_xml
//解析xml
cout << "姓名:" << pt.get<string>("stu.name") << endl;
cout << "年龄:" << pt.get<int>("stu.age") << endl;
cout << "平均分:" << pt.get<float>("stu.score") << endl;
//获取节点属性
cout << "学号:" << pt.get<string>("stu.name.<xmlattr>.id") << endl;
//找不到节点,输出默认值
cout << "性别:" << pt.get<string>("stu.sex","保密") << endl;
//节点里面的内容不是数据,而是节点
auto pt2=pt.get_child("stu.lesson");
for (auto it = pt2.begin(); it != pt2.end(); ++it)
{
cout << it->first.data() << "->" << it->second.data() << endl;
}
}
catch (const std::exception& e)
{
cout << e.what() << endl;
}
getchar();
return 0;
}
运行结果:
4. C++中解析JSON文件
在项目中C++
读取和设置JSON
文件是最常用的操作,以下是常用的几个的JSON
解析器。
RapidJSON
是一个C++
的小而全的JSON
解析器及生成器。它的灵感来自RapidXml
,它同时支持SAX
和DOM
风格的API
;Jsoncpp
是个跨平台的开源库,主要包含三种类型的class:Value
,Reader
、Writer
;cJSON
是一个超轻巧,单文件,可以作为ANSC标准的ON解析器。
5. property_tree 解析JSON示例代码
使用需要包含头文件:
#include<boost/property_tree/ptree.hpp>
#include<boost/property_tree/json_parser.hpp>
命名空间:
using namespace boost::property_tree;
test.json
{
"stu": {
"name": "小明",
"age": 18
},
"score": 8.23,
"lesson": [
"Math",
"English"
]
}
main.cpp
#include<boost/property_tree/ptree.hpp>
#include<boost/property_tree/json_parser.hpp>
using namespace boost::property_tree; //名字空间
#include<Windows.h>
#include<iostream>
using namespace std;
int main()
{
try
{
//定义basic_ptree<std::string, std::string>对象
ptree pt;
//读取json文件
read_json("test.json", pt);
//解析json内容
//cout <<"姓名:"<<pt.get<string>("stu.name") << endl;
string str = pt.get<string>("stu.name");
cout << str.length() << endl;//小明 两个中文,占了6个字节,说明是utf-8的编码
//-----------------------仅仅为了输出----------------------------------
//cout无法输出 utf-8的编码
//下面考虑utf-8转换为unicode, 用wstring接受,然后用wcount输出
//求转换为unicode需要多大的空间存放
int len=MultiByteToWideChar(CP_UTF8, NULL, str.data(), str.length(), 0, 0);
//开始转换编码
wchar_t *pw = new wchar_t[len + 1];
MultiByteToWideChar(CP_UTF8, NULL, str.data(), str.length(),pw , len + 1);
pw[len] = L'\0';
//设置wcout本地环境
wcout.imbue(locale("", LC_CTYPE));
wcout <<L"姓名:" << pw << endl;
//-----------------------仅仅为了输出----------------------------------
cout << "年龄:" << pt.get<int>("stu.age") << endl;
cout << "成绩:" << pt.get<float>("score") << endl;
cout << "性别:" << pt.get<string>("sex" , "保密") << endl;
//属性下面是数组
auto pt2= pt.get_child("lesson");
for (auto it = pt2.begin(); it != pt2.end(); it++)
{
cout /*<< it->first.data() << "->" */<< it->second.data() << endl;
}
}
catch (const std::exception& e)
{
cout << e.what() << endl;
}
getchar();
return 0;
}
运行结果:
更多推荐
所有评论(0)