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);
是编译时错误Name="Hello 1"
)根据doc似乎我应该将它们添加到“子项”,但是如何? 更新我试过了:pt.put("Root.Set.Field.xmlattr.Name", "Hello 1");
期待看到<Field Name="Hello 1"/>
,但仍然无效。等待能够分享正确语法的人。
upd2 bingo,这个语法有效,我将继续尝试明天打印所需的xml。 pt.put("Root.Set.Field.<xmlattr>.Name", "Hello 1");
答案 0 :(得分:11)
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>
答案 1 :(得分:1)
property_tree不是一般的XML API。它适用于应用程序配置设置。想一想:Windows INI文件,或C#.config文件,或Java .properties文件。如果您尝试将其视为XML解析器,您将会感到不快。
您应该使用的内容取决于您的要求。例如xerces是企业级库。如果您可以更灵活地处理数据结构,则可以使用proprty_tree。还有很多其他选择。