Как получить полный дочерний объект узла 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) {
          // ...
        }
      }
    }
  }
}
Другие вопросы по тегам