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文档解析开源项目,通过DOMSAX等方式解析。
  • libXML是一个用于解析xml文件的库,在各个平台下都能使用,也支持多种语言,如CPython

2. property_tree库简介

Boost库中的 property_tree库是个保存了多个属性值的树形数据结构,可以很方便的解析或生成xmljsoniniinfo文件。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;
}

运行结果:

image-20210504184415266

4. C++中解析JSON文件

在项目中C++读取和设置JSON文件是最常用的操作,以下是常用的几个的JSON解析器。

  • RapidJSON是一个C++的小而全的JSON解析器及生成器。它的灵感来自 RapidXml,它同时支持SAXDOM风格的API
  • Jsoncpp是个跨平台的开源库,主要包含三种类型的 class:ValueReaderWriter
  • 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;
}

运行结果:

image-20210504185424328

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐