【问题标题】:writing more complex than trivial xml with boost property tree使用 boost 属性树编写比普通 xml 更复杂的内容
【发布时间】:2013-09-23 09:38:57
【问题描述】:

UPD 我找到了“格式化”问题here 的答案,所以我删除了这部分问题,请阅读更新后的问题:

我需要在 C++ 上将 xml 写入文件系统。 我已经学习了this 标题。在本教程中,使用了非常简单的 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;
}

输出是:

<?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") 根据 doc 看来我应该将它们添加到“子键”中,但是如何?

upd 我试过了:pt.put("Root.Set.Field.xmlattr.Name", "Hello 1"); 期待看到 &lt;Field Name="Hello 1"/&gt; 但仍然不起作用。等待可以分享正确语法的人。

upd2 宾果游戏,这个语法有效,明天我将继续尝试打印所需的 xml。 pt.put("Root.Set.Field.&lt;xmlattr&gt;.Name", "Hello 1");

【问题讨论】:

标签: c++ boost boost-propertytree


【解决方案1】:

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

#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;
}

输出:

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

【讨论】:

    【解决方案2】:

    property_tree 不打算用作通用 XML API。它适用于应用程序配置设置。想想:Windows INI 文件,或 C# .config 文件,或 Java .properties 文件。如果你试图把它当作一个 XML 解析器,你会很不高兴。

    您应该使用什么取决于您的要求。 xerces,例如是一个企业级库。如果您可以在数据结构上更加灵活,您可以使用proprty_tree。还有很多其他选择。

    【讨论】:

    • 在c++上写xml解析应该用什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    相关资源
    最近更新 更多