使用boost :: property_tree考虑以下代码:
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
using namespace boost::property_tree;
int main() {
ptree model_tree;
model_tree.add("calibrated", "true");
model_tree.add("model.<xmlattr>.label", "label");
model_tree.add("model.activity.<xmlattr>.type", "fixed");
write_xml("test.xml", model_tree);
}
Run Code Online (Sandbox Code Playgroud)
通过编译和执行程序,我得到以下输出:
<?xml version="1.0" encoding="utf-8"?>
<calibrated>true</calibrated><model label="label"><activity type="fixed"/></model>
Run Code Online (Sandbox Code Playgroud)
这不是我所期望的,因为没有新的线条也没有缩进.我希望得到以下内容:
<?xml version="1.0" encoding="utf-8"?>
<calibrated>true</calibrated>
<model label="label">
<activity type="fixed"/>
</model>
Run Code Online (Sandbox Code Playgroud)
这是一个错误,还是有选择获得后者的输出?任何帮助,将不胜感激.
PS:我正在使用Ubuntu 12.04 LTS和gcc 4.6.3并提升1.48.
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);编译时错误 …我正在使用 Boost 属性树将我的类实例导出为 XML 节点。它有效,但它只是将所有内容放在 1 行中。我希望它有缩进,例如:
<?xml version="1.0" encoding="utf-8"?>
<root>
<sensorconfigurations>
<configuration>
<name>SensorConfiguration1</name>
<sensorid>1</sensorid>
<signalindex>1</signalindex>
<mappingscheme>mappingscheme1</mappingscheme>
<soundpack>test1.wav</soundpack>
</configuration>
<configuration>
<name>SensorConfiguration2</name>
<sensorid>2</sensorid>
<signalindex>2</signalindex>
<mappingscheme>mappingscheme1</mappingscheme>
<soundpack>test2.wav</soundpack>
</configuration>
<configuration>
<name>SensorConfiguration3</name>
<sensorid>3</sensorid>
<signalindex>3</signalindex>
<mappingscheme>mappingscheme2</mappingscheme>
<soundpack>test3.wav</soundpack>
</configuration>
</sensorconfigurations>
</root>
Run Code Online (Sandbox Code Playgroud)
这有可能吗?我是否缺少 write_xml 方法中的参数?
这是我的代码:
void SensorConfigurationBank::save()
{
using boost::property_tree::ptree;
ptree pt;
for(map<string, SensorConfiguration>:: iterator it = sensorConfigurations_.begin(); it != sensorConfigurations_.end(); ++it)
{
ptree myTree;
myTree.put("name", it->second.getName());
myTree.put("sensorid", it->second.getSensorID());
myTree.put("signalindex", it->second.getsignalIndex());
MappingScheme myScheme = it->second.getMScheme();
myTree.put("mappingscheme", myScheme.getId());
SoundPack mySound = it->second.getSound();
myTree.put("soundpack", mySound.filepath_);
pt.add_child("root.sensorconfigurations.configuration", myTree);
} …Run Code Online (Sandbox Code Playgroud)