可以在不使用发射器和节点事件的情况下遍历yaml-cpp树吗?

时间:2014-01-22 15:08:49

标签: yaml-cpp

我正试图走一个yaml-cpp(0.5.1)节点,之前我什么都不知道。我知道有一个YAML :: Dump使用发射器和节点事件来做到这一点,但我想知道是否有一种不使用发射器的方法。

我尝试了以下代码,但未能找到确定所有必需案例所需的方法:

void yaml_cpp_TestFunc_recursedown(YAML::Node& node)
{
  for(YAML::const_iterator it=node.begin();it!=node.end();++it)
  {
     auto dit = *it;
     try
     {
        if (dit.IsDefined())
        {
           try
           {
              std::cout << dit.as<std::string>() << std::endl;
           }
           catch (...) { }
           yaml_cpp_TestFunc_recursedown(dit);
        }
        else {}
     }
     catch (const YAML::InvalidNode& ex)
     {
        try
        {
           if (dit.second.IsDefined())
           {
              try
              {
                 std::cout << dit.second.as<std::string>() << std::endl;
              }
              catch (...) { }
              yaml_cpp_TestFunc_recursedown(dit);
           }
           else {}
        }
        catch (...) { }
     }
     catch (...) { }
  }
}
void yaml_cpp_Test()
{
  const std::string testfile=".\\appconf.yaml";

  {
     // generate a test yaml
     YAML::Node node;
     node["paths"].push_back("C:\\test\\");
     node["paths"].push_back("..\\");
     node["a"] = "123";
     node["b"]["c"] = "4567";

     YAML::Emitter emitter;
     emitter << node;

     std::ofstream fout(testfile);
     fout << emitter.c_str();
  }

  {
     // try to walk the test yaml
     YAML::Node config = YAML::LoadFile(testfile);
     yaml_cpp_TestFunc_recursedown(config);
  }
}

1 个答案:

答案 0 :(得分:1)

您可以查看Node::Type()并进行相应处理:

void WalkNode(YAML::Node node) {
  switch (node.Type()) {
    case YAML::NodeType::Null:
      HandleNull();
      break;
    case YAML::NodeType::Scalar:
      HandleScalar(node.Scalar());
      break;
    case YAML::NodeType::Sequence:
      for (auto it = node.begin(); it != node.end(); ++it) {
        WalkNode(*it);
      }
      break;
    case YAML::NodeType::Map:
      for (auto it = node.begin(); it != node.end(); ++it) {
        WalkNode(it->first);
        WalkNode(it->second);
      }
      break;
    case YAML::NodeType::Undefined:
      throw std::runtime_exception("undefined node!");
  }
}