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

Posted

技术标签:

【中文标题】可以在不使用发射器和节点事件的情况下遍历 yaml-cpp 树吗?【英文标题】:Possible to walk a yaml-cpp tree without using emitter and node events? 【发布时间】:2014-01-22 15:08:48 【问题描述】:

我正在尝试遍历一个我以前一无所知的 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】:

您可以查看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!");
  

【讨论】:

太棒了!非常感谢你。我想补充一点,在某些情况下,将当前节点作为参数添加到 HandleNull() 可能会很方便。

以上是关于可以在不使用发射器和节点事件的情况下遍历 yaml-cpp 树吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不知道终端标量的映射和类型中的键的情况下使用 yaml-cpp 库解析任意 yaml 文件?

将多行字符串添加到 Yaml-cpp 节点

在不使用发射的情况下跟踪父级中的子组件值?

如何为特定的 yaml-cpp 节点设置发射样式

在不触发发射的情况下插入 Android Room 表?

POJ 1155 树形背包