如何使 boost ptree 以相同的方式解析 xml 和 json?
Posted
技术标签:
【中文标题】如何使 boost ptree 以相同的方式解析 xml 和 json?【英文标题】:How to make boost ptree parse xml and json the same way? 【发布时间】:2011-07-11 00:08:39 【问题描述】:让我们来看看修改过的example 代码:
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <boost/foreach.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
void load(const std::string &file_path)
using boost::property_tree::ptree;
ptree pt;
std::ifstream script;
script.open(file_path.c_str());
read_xml(script, pt);
BOOST_FOREACH(boost::property_tree::ptree::value_type &v,
config.get_child("config.servecies"))
std::cout
<< "First data: " << v.first.data() << std::endl
<< "Second data: " << v.second.data() << std::endl;
我用这样的xml试一下:
<config>
<servecies>
<module>file</module>
<module>Admin</module>
<module>HR</module>
<notModule>MyNotModule</notModule>
</servecies>
</config>
打印出来:
第一个数据:模块 第二个数据:文件 第一个数据:模块 第二个数据:管理员 第一个数据:模块 第二个数据:人力资源 第一个数据:notModule 第二个数据:MyNotModule
但是当我尝试这样的 json 文件时(通过 this web tool 从这个 xml 创建):
"config":
"name": "myconfig",
"servecies":
"module": [
"file",
"Admin",
"HR"
],
"notModule": "MyNotModule"
打印出来:
第一个数据:模块 第二个数据: 第一个数据:notModule 第二个数据:MyNotModule
如何让 boost property_tree 在 JSON 上产生与解析 XML 相同的结果?如何判断 value_type 是否是某种一维数组并遍历它?
【问题讨论】:
【参考方案1】:如何让 boost property_tree 在 JSON 上产生与解析 XML 相同的结果?
让 Boost.PropertyTree 输出 JSON。然后它将能够输入该 JSON 文件。
Boost.PropertyTree 用于存储属性。这是一种以人类可读格式保存属性并在以后恢复这些属性的方法。
它不是一种制作快速而肮脏的 JSON/XML 阅读器的方法。它以特定格式写入数据,当它被赋予要读取的数据时,它期望给它的数据就是它写入的数据。如果您尝试将任何旧的 JSON 向下推,它不一定会返回合理的信息。它写入有效的 JSON,但该 JSON 的结构特定于 PropertyTree,读取代码将期望该结构存在。
旁注:我认为网络工具不是很好,因为它向 JSON 文件添加了原始 XML 中不存在的信息。
【讨论】:
以上是关于如何使 boost ptree 以相同的方式解析 xml 和 json?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Boost ptree C++ 解析其值中包含 HTML 标记的 XML
c++ boost xml解析器ptree.get函数——不接受节点名中的空格