Как получить полный дочерний объект узла yaml от родительского узла yaml?
Я пытаюсь получить полный объект узла при разборе файла yaml. Мои данные yaml похожи на данные ниже
---
Parent:
Child1: ABC
Child2:
Subchild1: 123
Subchild2: 456
Child3: XYZ
...
То, как я пытаюсь получить данные
YAML::Node parentNode = YAML::LoadFile(abc.yaml); // My yaml file name is abc
if(!parentNode.IsNull())
{
if(parentNode.IsMap())
{
YAML::iterator it = parentNode.begin();
std::cout << "Parent is " << it->first.as<std::string>() << std:endl; // Parent
if(it->second.IsScalar())
{
}
else if(it->second.IsMap())
{
YAML::Node rootChild = it->second;
YAML::iterator chilItr = rootChild.begin();
std::cout << "Child count is " << chilItr->second.size() << std:endl; // 3
while(chilItr != rootChild.end())
{
YAML::Node child = *chilItr;
if(child.IsMap()) //This causes exceetion
{
YAML::iterator ChildIterator = Child.begin();
std::cout << " Child is " << ChildIterator->first.as<std::string>() << std::endl;
}
chilItr++;
}
}
}
}
Почему child.IsMap()
бросить исключение? Таким образом, в основном требование заключается в том, как я могу получить дочерний объект узла YAML от родительского объекта?
1 ответ
Я не думаю, что вы вставили точный файл YAML или точный код, который вы используете, так как ваш комментарий 3
не будет того, что напечатано, используя ваш пример. Вот основная идея, используя ваш пример файла YAML:
YAML::Node parentNode = YAML::LoadFile("abc.yaml");
if (parentNode.IsMap()) {
YAML::iterator it = parentNode.begin();
YAML::Node key = it->first;
YAML::Node child = it->second;
std::cout << "Parent is " << key.as<std::string>() << "\n"; // Parent
if(child.IsMap()) {
std::cout << "Child count is " << child.size() << "\n"; // 3
// Now that you've got a map, you can iterate through it:
for (auto it = child.begin(); it != child.end(); ++it) {
YAML::Node childKey = it->first;
YAML::Node childValue = it->second;
// Now you can check the childValue object
if(childValue.IsMap()) {
// Iterate through it, if you like:
for (auto it = childValue.begin(); it != childValue.end(); ++it) {
// ...
}
}
}
}
}