Как получить родительский узел текущего узла при выполнении итерации по YAML ::Node?

#c #yaml #yaml-cpp

#c #yaml #yaml-cpp

Вопрос:

Я создаю древовидную структуру при выполнении итерации по YAML::Node . Пока что я могу построить дерево, когда иерархия идет вниз. Но если есть изменения в иерархии, я не могу получить родительский узел.

 batman:
  type: super hero
  entity: ""
  natural: yes
  attributes:
    powers:
      whip:
        x: ""
        y: ""
      batmobile:
        x: ""
        y: ""
  

Основываясь на приведенной выше структуре, как мне получить родительский узел batmobile ?
Предполагая, что я выполняю итерацию следующим образом:

 for (YAML::const_iterator it = node.begin(); it != node.end();   it)
{
    std::cout << it->first.as<std::string>() << std::endl; // prints batmobile
    
   // how to get the parent node of batmobile?
}
  

Ответ №1:

Вы не можете, потому что, как правило, у узла YAML нет ни одного родителя.

Содержимое файла YAML представляет собой ориентированный граф, а не дерево. Например, этот YAML:

 - amp;a 123
- foo: *a
  

Определяет последовательность из двух элементов, скалярного узла 123 и узла сопоставления, содержащего единственную пару ключ-значение. Эта пара имеет скалярный foo в качестве ключа и скалярный узел 123 в качестве значения (псевдоним разрешается синтаксическим анализатором). Это означает, что скалярный узел 123 ссылается из двух мест и, следовательно, не имеет ни одного родителя.

Другая проблема заключалась бы в том, что внутри пары foo: bar запрос родительского узла bar выдал бы отображение, содержащее пару, потому что сама пара не является узлом. Но вы, вероятно, также хотите знать соответствующий ключ.

Вывод заключается в том, что при спуске в график YAML вам нужно где-то сохранить путь, по которому вы идете, если вы хотите вернуться назад.