可以在不使用发射器和节点事件的情况下遍历 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 树吗?的主要内容,如果未能解决你的问题,请参考以下文章