在yaml-cpp中如何获取YAML文档的顶级键名?
如何用yaml-cpp获取YAML根节点的键名
先看你的示例YAML文件:
Foo: id: 10 name: "bob"
你已经能成功加载文件并访问Foo下的子节点,但卡在了获取根节点的键名Foo上——这是因为yaml-cpp对Map类型节点的遍历需要用键值对的方式来处理,直接遍历节点本身会因为类型不匹配抛出异常。
正确的实现方式
你可以通过遍历Map节点的键值对来获取键名,下面是两种可行的写法:
方式1:范围for循环(C++11及以上)
#include <iostream> #include <yaml-cpp/yaml.h> int main() { YAML::Node doc = YAML::LoadFile("sample.yaml"); // 先判断节点类型是Map再遍历 if (doc.Type() == YAML::NodeType::Map) { for (const auto& kv_pair : doc) { // 将键节点转换为字符串 std::string key = kv_pair.first.as<std::string>(); YAML::Node value_node = kv_pair.second; std::cout << "根节点键名:" << key << "\n"; // 继续处理子节点,比如获取id std::cout << "对应id值:" << value_node["id"].as<int>() << "\n"; } } return 0; }
方式2:传统迭代器遍历
如果你需要兼容更早的C++标准,可以用迭代器方式:
#include <iostream> #include <yaml-cpp/yaml.h> int main() { YAML::Node doc = YAML::LoadFile("sample.yaml"); if (doc.Type() == YAML::NodeType::Map) { YAML::const_iterator it = doc.begin(); while (it != doc.end()) { std::string key = it->first.as<std::string>(); YAML::Node value_node = it->second; std::cout << "根节点键名:" << key << "\n"; std::cout << "对应id值:" << value_node["id"].as<int>() << "\n"; ++it; } } return 0; }
关键说明
- yaml-cpp中Map类型的节点,其迭代器返回的是
std::pair<const YAML::Node, YAML::Node>类型,第一个元素是键的节点,第二个是对应的值节点。 - 必须先判断节点类型为
YAML::NodeType::Map再进行遍历,避免类型不匹配的异常。 - 调用
as<std::string>()可以将键节点转换为字符串类型,这是获取键名的核心步骤。
运行这段代码后,你就能成功输出根节点的键名Foo,同时也能正常访问对应的子节点内容。
内容的提问来源于stack exchange,提问作者Davy Durham
相关产品推荐
相关产品推荐

