c++ Boost属性树通过属性限定符更新现有节点

C++ Boost Property Tree Update Existing Node By Attribute Qualifier

本文关键字:属性 更新 节点 Boost c++      更新时间:2023-10-16

好的,这里有一个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>

我希望能做两件事:

  1. 直接对Test a元素执行get操作,而不必循环所有Ignore元素,就像属性上的选择器一样。
  2. 如果没有别的,我需要一个方法来更新忽略元素,似乎不能找出

我必须删除元素并重新创建它吗?我似乎找不到一种方法来执行一个放置,它通过一个属性(在该级别上是唯一的)来限定一个元素(在同一级别上有许多具有相同名称的元素)。

类似:

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);