C++ 使用boost属性树编写比普通xml更复杂的xml

C++ 使用boost属性树编写比普通xml更复杂的xml,c++,boost,boost-propertytree,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

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;
}
#包括
#包括
//
//  
//      
//      
//  
//  
//      
//      
//  
//
int main(int argc,char*argv[])
{
使用boost::property_tree::ptree;
ptree-pt;
pt.put(“Root.Set.Field”,“Hello”);
pt.put(“Root.Set.Field”、“World”);
boost::property\u tree::xml\u writer\u设置('\t',1);
编写xml(“testXml.xml”,pt,std::locale(),settings);
返回0;
}
输出为:

<?xml version="1.0" encoding="utf-8"?>
<Root>
<Set>
    <Field>World</Field>
</Set>
</Root>

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

  • 如何添加多个同名节点?添加
    true
    类似于
    pt.put(“Root.Set.Field”,“Hello”,true)是编译时错误
  • 如何设置xml属性?(
    Name=“Hello 1”
    )根据文档,似乎我应该将它们添加到“子键”中,但如何添加
upd我试过:
pt.put(“Root.Set.Field.xmlatr.Name”,“Hello 1”)
希望看到
,但仍然不起作用。等待能分享正确语法的人


upd2宾果,这种语法有效,明天我将继续尝试打印所需的xml<代码>pt.put(“Root.Set.Field..Name”,“Hello 1”)

属性树不打算作为通用XML API。它用于应用程序配置设置。想想:WindowsINI文件,或者C#.config文件,或者Java.properties文件。如果您试图将其视为XML解析器,您将会不高兴

您应该使用什么取决于您的需求,例如,一个企业类库。如果数据结构更灵活,可以使用property_树。还有许多其他选择。

回答了最后一个问题-如何使用多个同名节点。 最后我编写了这样的程序来解决这个问题

#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;
}
#包括
#包括
//
//  
//      
//      
//  
//  
//      
//      
//  
//
int main(int argc,char*argv[])
{
使用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(“.Name”,“Hello 1”);
fieldNode2.put(“.Name”,“World 1”);
fieldNode3.put(“.Name”,“Hello 2”);
fieldNode4.put(“.Name”,“World 2”);
setNode1.添加子项(“字段”,fieldNode1);
setNode1.添加子项(“字段”,fieldNode2);
setNode2.add_child(“Field”,fieldNode3);
setNode2.add_child(“Field”,fieldNode4);
setNode1.put(“.Name”,“1”);
setNode2.put(“.Name”,“2”);
rootNode.add_child(“Set”,setNode1);
rootNode.add_child(“Set”,setNode2);
添加子节点(“根”,根节点);
boost::property\u tree::xml\u writer\u设置('\t',1);
编写xml(“testXml.xml”,pt,std::locale(),settings);
返回0;
}
输出:

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


我在C++上应该用什么来编写和解析XML?如果我可以用“代码> Boost ”做我需要做的事情,我宁愿呆在Boost上。我不想仅仅为了配置解析而添加额外的框架。如果只是为了配置解析,那么您真的需要详细控制数据在配置中的存储方式吗?在property_tree API级别进行操作,并让boost以其喜欢的方式存储它作为实现细节,您会更高兴吗?