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

Я строю древовидную структуру, перебирая 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?
}

person MarKS    schedule 24.08.2020    source источник


Ответы (1)


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

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

- &a 123
- foo: *a

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

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

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

person flyx    schedule 25.08.2020