C ++ Boost属性树按属性限定符更新现有节点

时间:2011-12-15 02:29:09

标签: c++ boost-propertytree

好的,这是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. 直接执行测试A元素,而不必循环所有忽略元素。就像属性上的选择器一样。
  2. 如果不出意外,我需要一种更新Ignore元素的方法,但似乎无法弄清楚
  3. 我是否必须删除该元素并重新创建它?我似乎无法找到一种方法来执行一个put,它通过一个属性(在那个级别上是唯一的)来限定一个元素(在同一级别有许多同名的元素)。

    类似的东西:

    pt.put("config.Ignored.Ignore.<xmlattr>.name='Test A'.Criteria.value",some_var)
    

    或任何其他可以实现最终目标的东西。非常感谢你!

    完全披露:我对C ++很陌生,可能会遗漏一些明显的东西。

2 个答案:

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