使用boost的property_tree解析内存缓冲区中的XML
上一篇文章中是使用boost的property_tree来读取本地XML文件的方式来解析的,见https://www.zoudaokou.com/index.php/archives/628,但在某些情况下,我是从网络上接收到XML数据的,如果再将XML数据存在文件中,再用read_xml读取文件,就显示多余了,本文介绍直接使用property_tree将内存中保存的XML数据解析出来。
在property_tree中读取XML内容的函数是read_xml,它的参数有两种形式:
[php]
//第一种形式
template<class Ptree> void read_xml(std::basic_istream<typename Ptree::key_type::value_type> &stream,
Ptree &pt,
int flags = 0)
//第二种形式
template<class Ptree> void read_xml(const std::string &filename,
Ptree &pt,
int flags = 0,
const std::locale &loc = std::locale())
[/php]
第二种形式中第一个参数是文件名,在第一种形式中,可以看到第一个参数为std::basic_istream
例如在内存中的XML文件内容如下:
[php]
<config>
<serverName>www.zoudaokou.com</serverName>
</config>
[/php]
解析内存中的XML文件代码如下:
[php]
#include <iostream>
#include <string>
#include <strstream>
#include "boost/property_tree/xml_parser.hpp"
using namespace std;
int main()
{
//下面这段是将文件读取内存中,模拟从网络上接收到XML数据存入内存
int buffLen = 10240;
char buffer[10240];
FILE* pFile = fopen("config.xml", "rb");
if (pFile)
{
buffLen = fread(buffer, sizeof(char), 10240, pFile);
fclose(pFile);
}
boost::property_tree::ptree pt; //定义一个存放xml的容器指针
istrstream iss(buffer, buffLen);
boost::property_tree::read_xml(iss, pt); //读取内存中的数据 入口在pt这个指针
string serverName = pt.get<string>("config.serverName"); //获取config下一层serverName的值
cout << "serverName:" << serverName << endl;
return 0;
}
[/php]