用boost属性树编写比普通xml更复杂的东西

jav*_*red 6 c++ boost boost-propertytree

UPD我已经找到答案,"格式化"的问题在这里,所以我删除了这部分的质询,请阅读最新的问题:

我需要在c ++上将xml写入文件系统.我已经学会了这个知识分子.在教程中使用了非常简单的xml.我的xml更复杂,我不知道如何修改代码来生成它.这就是我的代码:

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

//<Root>
//  <Set Name="1">
//      <Field Name="Hello 1"/>
//      <Field Name="World 1"/>
//  </Set>
//  <Set Name="2">
//      <Field Name="Hello 2"/>
//      <Field Name="World 2"/>
//  </Set>
//</Root>

int main(int argc, char* argv[])
{
    using boost::property_tree::ptree;
    ptree pt;

    pt.put("Root.Set.Field", "Hello");
    pt.put("Root.Set.Field", "World");

    boost::property_tree::xml_writer_settings<char> settings('\t', 1);
    write_xml("testXml.xml", pt, std::locale(), settings);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

<?xml version="1.0" encoding="utf-8"?>
<Root>
<Set>
    <Field>World</Field>
</Set>
</Root>
Run Code Online (Sandbox Code Playgroud)

如何修改我的程序以生成所需的xml,特别是:

  • 如何添加多个同名的点头?true像那样添加pt.put("Root.Set.Field", "Hello", true);编译时错误
  • 如何设置xml属性?(Name="Hello 1")根据doc似乎我应该将它们添加到"子键",但是如何?

UPD我已经试过了:pt.put("Root.Set.Field.xmlattr.Name", "Hello 1");期待看到,<Field Name="Hello 1"/>但仍然无法正常工作.等待可以分享正确语法的人.

upd2宾果,这个语法有效,我会继续尝试明天打印所需的xml.pt.put("Root.Set.Field.<xmlattr>.Name", "Hello 1");

jav*_*red 11

回答了最后一个问题 - 如何使用具有相同名称的多个节点.最后我编写了解决问题的程序

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

//<Root>
//  <Set Name="1">
//      <Field Name="Hello 1"/>
//      <Field Name="World 1"/>
//  </Set>
//  <Set Name="2">
//      <Field Name="Hello 2"/>
//      <Field Name="World 2"/>
//  </Set>
//</Root>

int main(int argc, char* argv[])
{
    using boost::property_tree::ptree;
    ptree pt;

    boost::property_tree::ptree rootNode;
    boost::property_tree::ptree setNode1;
    boost::property_tree::ptree setNode2;
    boost::property_tree::ptree fieldNode1;
    boost::property_tree::ptree fieldNode2;
    boost::property_tree::ptree fieldNode3;
    boost::property_tree::ptree fieldNode4;

    fieldNode1.put("<xmlattr>.Name", "Hello 1");
    fieldNode2.put("<xmlattr>.Name", "World 1");
    fieldNode3.put("<xmlattr>.Name", "Hello 2");
    fieldNode4.put("<xmlattr>.Name", "World 2");

    setNode1.add_child("Field", fieldNode1);
    setNode1.add_child("Field", fieldNode2);
    setNode2.add_child("Field", fieldNode3);
    setNode2.add_child("Field", fieldNode4);

    setNode1.put("<xmlattr>.Name", "1");
    setNode2.put("<xmlattr>.Name", "2");

    rootNode.add_child("Set", setNode1);
    rootNode.add_child("Set", setNode2);
    pt.add_child("Root", rootNode);

    boost::property_tree::xml_writer_settings<char> settings('\t', 1);
    write_xml("testXml.xml", pt, std::locale(), settings);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

<?xml version="1.0" encoding="utf-8"?>
<Root>
<Set Name="1">
    <Field Name="Hello 1"/>
    <Field Name="World 1"/>
</Set>
<Set Name="2">
    <Field Name="Hello 2"/>
    <Field Name="World 2"/>
</Set>
</Root>
Run Code Online (Sandbox Code Playgroud)