Удаление узла по имени в yaml-cpp

#c #yaml #yaml-cpp

Вопрос:

Кажется, я не могу справиться с удалением подузлов из узла YAML с помощью библиотеки YAML-cpp. Это код, который я пытаюсь использовать:

   YAML::Node y = YAML::Load("
  a: firstn
  b: secondn
  c: n
      d: thirdn
      e: n
          f: fourthn
          g: fifthn
  ");  
  cout << y;
  cout << endl << endl;
  y.remove(y["b"]);
  cout << y;
  cout << endl;
 

и это результат:

 a: first
c:
  e:
    g: fifth
    f: fourth
  d: third
b: second

a: first
c:
  e:
    g: fifth
    f: fourth
  d: third
b: second
 

в то время как ожидаемый результат должен заключаться в том, что второй испускаемый поток YAML не содержит элемента «b».

Что я здесь упускаю из виду? Спасибо 🙂

Ответ №1:

Оказывается, что node.remove() сломан в yaml-cpp 0.5.2, который является текущей версией на Ubuntu Ubuntu и многих других дистрибутивах. (https://github.com/jbeder/yaml-cpp/issues/338 )

Код должен выглядеть следующим образом:

 YAML::Node y = YAML::Load("
a: firstn
b: secondn
c: n
  d: thirdn
  e: n
      f: fourthn
      g: fifthn
");  
cout << y;
cout << endl << endl;
y.remove("b");
cout << y;
cout << endl;
 

таким образом, правильным параметром для remove является строка (учитывая, что я удаляю с карты), которая изначально не компилировалась:

 /usr/include/yaml-cpp/node/impl.h:392:58:   required from ‘bool    YAML::Node::remove(const Keyamp;) [with Key = char [2]]’
/turbine/turbine/src/components/yaml-test.cpp:51:15:   required from here
/usr/include/yaml-cpp/node/detail/impl.h:136:15: error: ‘equals’ was not declared in this scope
 if (equals(*it->first, key, pMemory)) {
...
 

но отлично работает в 0.5.3.