boostpropertytree在循环中添加节点

boost property_tree adding nodes in a loop

本文关键字:添加 节点 循环 boostpropertytree      更新时间:2023-10-16

如何在循环数组时将节点添加到属性树中?

这可能是一件简单的事情,但我不明白如何使用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。但实际上,输出列表一定是一件非常简单的事情吗?

在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>