好的,这里有一个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>
我希望能做两件事:
- 直接对Test a元素执行get操作,而不必循环所有Ignore元素,就像属性上的选择器一样。
- 如果没有别的,我需要一个方法来更新忽略元素,似乎不能找出
我必须删除元素并重新创建它吗?我似乎找不到一种方法来执行一个放置,它通过一个属性(在该级别上是唯一的)来限定一个元素(在同一级别上有许多具有相同名称的元素)。
类似:
pt.put("config.Ignored.Ignore.<xmlattr>.name='Test A'.Criteria.value",some_var)
或者任何能达到最终目标的东西。非常感谢!
完全披露:我是c++的新手,可能会错过一些明显的东西。
property_tree xml解析器(RapidXML)不支持这个。
如果您想要这样的功能,可以考虑使用TinyXPath之类的工具。
或者使用显式循环查找具有所需属性的Ignore
节点。然后可以使用
someIgnoreNode.put("Criteria.value", some_var);
您可以使用如下方法:
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);