在循环数组时如何向属性树添加节点?
这可能是一件简单的事情,但我只是不明白如何使用boost_property_tree。
我有一个值数组,我想要添加到属性树并将其输出为xml。如果我硬编码节点并手动将它们添加到根节点,它可以工作,但如果我尝试从循环内部执行它,则xml无效,只包含数组中的一个节点,并且没有任何xml节点终止。
这是一个可变长度的数据数组,因此无法对节点进行硬编码。做这样的事情根本行不通。我不明白为什么?
ptree listnode;
std::vector<data> dataarray= ...
for(auto data : dataarray)
{
ptree node;
...
listnode.add_child("value", node)
}
...
我想要的是这样的:
<list>
<value active="true">12</value>
<value active="true">44</value>
<value active="true">23</value>
</list>
但是生成的xml看起来像这样:
<list>
<value active="true">
它在第一个值节点之后停止。没有例外或任何事情,所以我假设我的property_tree无效或者xml_parser :: write_xml无法创建xml。
我很可能误解了如何使用boost :: property_tree。但实际上,输出列表必须非常简单?
答案 0 :(得分:3)
<强> Live On Coliru 强>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <iostream>
using namespace boost::property_tree;
int main() {
ptree pt;
auto& list = pt.add_child("list", ptree{});
for (auto data : { 12, 44, 23 })
list.add("value", data)
.add("<xmlattr>.active", true);
xml_parser::write_xml(std::cout, pt);
}
产生的XML:
<?xml version="1.0" encoding="utf-8"?>
<list>
<value active="true">12</value>
<value active="true">44</value>
<value active="true">23</value>
</list>