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>

私は2つのことができるようになりたいです:

  1. 属性のセレクターのように、すべてのIgnore要素をループすることなく、TestA要素に直接getを実行します。
  2. 他に何もないとしても、Ignore要素のいずれかを更新する方法が必要であり、それを理解できないようです

要素を削除して再作成する必要がありますか?要素(同じレベルで同じ名前の要素が多数ある場合)を属性(そのレベルで一意になる)で修飾するputを実行する方法を理解できないようです。

何かのようなもの:

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 に答える