6

好的,下面是 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. 如果不出意外,我需要一种更新任何一个 Ignore 元素的方法,但似乎无法弄清楚

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

就像是:

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

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

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

4

2 回答 2

6

Boost.property_tree xml 解析器(RapidXML)不支持这个。
如果您想要开箱即用的功能,请考虑使用 TinyXPath 之类的东西。

或使用显式循环查找Ignore具有所需属性的节点。然后你可以使用

someIgnoreNode.put("Criteria.value", some_var);
于 2011-12-15T08:09:56.530 回答
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);

 
于 2021-06-29T05:59:39.613 回答