#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 вам нужно где-то сохранить путь, по которому вы идете, если вы хотите вернуться назад.