好的,这是XML结构的一个示例:
<config>
<Ignored>
<Ignore name="Test A">
<Criteria>
<value>actual value</value>
</Criteria>
</Ignore>
<Ignore name="Test B">
<Criteria>
<value>actual value</value>
</Criteria>
</Ignore>
</Ignored>
<config>
我希望能够做两件事:
我是否必须删除该元素并重新创建它?我似乎无法找到一种方法来执行一个put,它通过一个属性(在那个级别上是唯一的)来限定一个元素(在同一级别有许多同名的元素)。
类似的东西:
pt.put("config.Ignored.Ignore.<xmlattr>.name='Test A'.Criteria.value",some_var)
或任何其他可以实现最终目标的东西。非常感谢你!
完全披露:我对C ++很陌生,可能会遗漏一些明显的东西。
答案 0 :(得分:5)
Boost.property_tree xml解析器(RapidXML)不支持此功能 考虑使用像TinyXPath这样的东西你想要这样的功能开箱即用。
或使用显式循环查找具有必需属性的Ignore
节点。然后你可以使用
someIgnoreNode.put("Criteria.value", some_var);
答案 1 :(得分:0)
您可以使用以下方法:
auto & pt_child = pt.getchild("config.Ignored");
BOOST_FOREACH(ptree::value_type &v1, pt_child)
{
if (v1.first == Ignore && v1.second.get<std::string>("<xmlattr>.name") == "Test A")
{
ptree & ptGrandChild = v1.second;
ptGrandChild.put<std::string>("Criteria.value", some_var);
}
}
boost::property_tree::xml_writer_settings<std::string> settings =
boost::property_tree::xml_writer_make_settings<std::string>('\t', 1);
write_xml(xmlPath, pt, std::locale(), settings);