c++ - 如何手动创建具有不同 XML 属性的 boost ptree?

标签 c++ xml boost xml-parsing boost-propertytree

我正在使用 boost 库来解析 XML 文件,并且必须手动创建 ptree。 我想使用 boost ptree 创建以下 xml 文件。

<?xml version="1.0"?>
<Txn>
    <Resp errCode="0" errInfo="" />
    <A exptime="20171230">xyz Information</A>
    <B>xyz Information</B>
    <C type="Active">xyz Information</C>
</Txn>

要实现上述xml, 下面是我的示例代码:

boost::property_tree::ptree pt;
boost::property_tree::ptree ptr1;
boost::property_tree::ptree ptr2;
boost::property_tree::ptree ptr3;

ptr1.put("<xmlattr>.errCode", Txn.resp.errCode);
ptr1.put("<xmlattr>.errInfo", Txn.resp.errInfo);

ptr2.push_back(boost::property_tree::ptree::value_type("A", boost::property_tree::ptree(data)));
ptr2.push_back(boost::property_tree::ptree::value_type("C", boost::property_tree::ptree(data)));

ptr2.put("A.<xmlattr>.exptime", data);
ptr2.put("C.<xmlattr>.type", data);


ptr3.put("<xmlattr>", data);

pt.add_child("Txn.Resp", ptr1);
pt.add_child("Txn", ptr2);
pt.add_child("Txn.B", ptr3);

此处子 AC 始终与父 Txn 单独创建,但我想在 Txn< 中添加所有子级 父级

。我不明白,为什么 child A和C在这里不一样。 如果有人帮助我提供正确的方法,这将非常有帮助。

最佳答案

这是我能想到的最简单的事情:

Live On Coliru

#include <boost/property_tree/xml_parser.hpp>
#include <iostream>

using boost::property_tree::ptree;
static auto pretty = boost::property_tree::xml_writer_make_settings<std::string>(' ', 4);

int main() {
    ptree root;
    root.add("Txn.Resp.<xmlattr>.errCode", 0);
    root.add("Txn.Resp.<xmlattr>.errInfo", "");

    root.add("Txn.A", "xyz Information");
    root.add("Txn.A.<xmlattr>.exptime", "20171230");

    root.add("Txn.B", "xyz Information");

    root.add("Txn.C", "xyz Information");
    root.add("Txn.C.<xmlattr>.type", "Active");

    write_xml(std::cout, root, pretty);
}

打印:

<?xml version="1.0"?>
<Txn>
    <Resp errCode="0" errInfo="" />
    <A exptime="20171230">xyz Information</A>
    <B>xyz Information</B>
    <C type="Active">xyz Information</C>
</Txn>

关键点是在添加属性之前创建元素节点,否则您会得到以下结果:

Live On Coliru

<?xml version="1.0" encoding="utf-8"?>
<Txn>
    <Resp errCode="0" errInfo=""/>
    <A exptime="20171230"/>
    <A>xyz Information</A>
    <B>xyz Information</B>
    <C type="Active"/>
    <C>xyz Information</C>
</Txn>

关于c++ - 如何手动创建具有不同 XML 属性的 boost ptree?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47003717/

相关文章:

c++ - C++ 函数的效率

c++ - 使函数参数成为具有多个参数的函数的错误

c# - foreach循环读取xml子节点

c++ - 我应该返回 bool 还是 const bool?

Android 原生 Parcel 使用

javascript - 在 ajax responseXML 中按名称获取 XML 元素?

java - Android:我无法通过 id 获取布局对象

c++ - 如何在你的 C++ 项目中包含 boost::thread?

c++ - 使用多线程 boost 条件变量

c++ - Boost Serialize - 以自定义方式序列化数据