如何使用 yaml-cpp 读取此 YAML 文件:
sensors:
- id: 5
hardwareId: 28-000005a32133
type: 1
- id: 6
hardwareId: 28-000005a32132
type: 4
Run Code Online (Sandbox Code Playgroud)
我不明白我如何获得sensors物品,使用它。
据我了解sensors是一个YAML::Node. 我怎么才能得到它?
更新 1:
YAML::Node config = YAML::LoadFile(config_path);
const YAML::Node& node_test1 = confg["sensors"];
for (std::size_t i = 0; i < node_test1.size(); i++) {
const YAML::Node& node_test2 = node_test1[i];
std::cout << "Id: " << node_test2["id"].as<std::string>() << std::endl;
std::cout << "hardwareId: " << node_test2["hardwareId"].as<std::string>() << std::endl << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
此代码有效,但它是使用有关旧 api 的教程编写的。我认为这段代码可以用迭代器重写,但我现在不知道如何重写。
我正在尝试使用 yaml-cpp,根据 wiki ,它是系统依赖项,因此我们甚至不需要更改 CMakelists.txt 或 manifest.xml。然而,当我编译代码时,我仍然收到如下错误:
/home/aramus/fuerte_workspace/sandbox/image_test/src/image_test.cpp:53: undefined reference to `YAML::Parser::Parser(std::basic_istream<char, std::char_traits<char> >&)'
/home/aramus/fuerte_workspace/sandbox/image_test/src/image_test.cpp:54: undefined reference to `YAML::Node::Node()'
/home/aramus/fuerte_workspace/sandbox/image_test/src/image_test.cpp:92: undefined reference to `YAML::Node::~Node()'
/home/aramus/fuerte_workspace/sandbox/image_test/src/image_test.cpp:92: undefined reference to `YAML::Parser::~Parser()'
/home/aramus/fuerte_workspace/sandbox/image_test/src/image_test.cpp:92: undefined reference to `YAML::Node::~Node()'
/home/aramus/fuerte_workspace/sandbox/image_test/src/image_test.cpp:92: undefined reference to `YAML::Parser::~Parser()'
/home/aramus/fuerte_workspace/sandbox/image_test/src/image_test.cpp:92: undefined reference to `YAML::Node::~Node()'
/home/aramus/fuerte_workspace/sandbox/image_test/src/image_test.cpp:92: undefined reference to `YAML::Parser::~Parser()'
Run Code Online (Sandbox Code Playgroud)
我添加到 CMakeLists.txt 的唯一代码是:
target_link_libraries(${PROJECT_NAME} yaml-cpp)
rosbuild_add_executable(image_test src/image_test.cpp)
Run Code Online (Sandbox Code Playgroud)
我在 Linux 中使用 fuerte。有人有什么解决办法吗?
编辑:我找到了我的解决方案!我更改了 CMakeLists.txt 以首先构建可执行文件,然后添加 yaml-cpp 库!
rosbuild_add_executable(image_test src/image_test.cpp)
target_link_libraries(image_test yaml-cpp)
Run Code Online (Sandbox Code Playgroud)
我的 CMakeLists.txt 中的这两行工作正常!
我对这个api处理地图与序列的处理有很基本的问题.说我有以下结构:
foo_map["f1"] = "one";
foo_map["f2"] = "two";
bar_map["b1"] = "one";
bar_map["b2"] = "two";
Run Code Online (Sandbox Code Playgroud)
我希望将其转换为以下YAML文件:
Node:
- Foo:
f1 : one
f2 : two
- Bar:
b1 : one
b2 : two
Run Code Online (Sandbox Code Playgroud)
我会这样做:
node.push_back("Foo");
node["Foo"]["b1"] = "one";
...
node.push_back("Bar");
Run Code Online (Sandbox Code Playgroud)
但是在最后一行节点现在已经从一个序列转换为一个映射,我得到了一个例外.我能做到这一点的唯一方法是输出地图地图:
Node:
Foo:
f1 : one
f2 : two
Bar:
b1 : one
b2 : two
Run Code Online (Sandbox Code Playgroud)
这个问题是我无法读回这些文件.如果我迭代Node,我甚至无法获得节点迭代器的类型而不会出现异常.
YAML::Node::const_iterator n_it = node.begin();
for (; n_it != config.end(); n_it++) {
if (n_it->Type() == YAML::NodeType::Scalar) {
// throws exception
}
}
Run Code Online (Sandbox Code Playgroud)
这应该很容易处理,但一直让我发疯!
我在yaml-cpp解析器中遇到了问题.当我尝试加载以下定义时:
DsUniversity:
university_typ: {type: enum, values:[Fachhochschule, Universitat, Berufsakademie]}
students_at_university: {type: string(50)}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Error: yaml-cpp: error at line 2, column 39: end of map flow not found
Run Code Online (Sandbox Code Playgroud)
我试图在http://yaml-online-parser.appspot.com/和http://yamllint.com/上验证yaml的有效性,并且两个服务都报告yaml有效.
问题是由"values:"定义后缺少空格引起的.当yaml更新为以下格式时:
DsUniversity:
university_typ: {type: enum, values: [Fachhochschule, Universitat, Berufsakademie]}
students_at_university: {type: string(50)}
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作.
是否有任何方法如何配置/更新/修复yaml-cpp解析器以继续结肠后缺少空格的yamls?
补充:似乎问题是由空char作为分隔符的要求引起的.当我简化测试片段时
DsUniversity:[Fachhochschule, Universitat, Berufsakademie]
Run Code Online (Sandbox Code Playgroud)
yaml-cpp解析器将其读作标量值"DsUniversity:[Fachhochschule,Universitat,Berufsakademie]".当冒号后添加空char时,yaml-cpp正确加载带序列的元素.
我正在尝试编写一个函数,用于在我的.yaml文件中编写/编辑节点yaml-cpp.我有点工作,因为我的代码将编辑本地副本.当我打印出来时,_baseNode它显示节点的值为5.4.但是,在退出该功能并.yaml在我的计算机上检查后,值5.4不存在.
这是我的尝试(_baseNode是我班级的私人成员):
void ParametersServerPC::testFunc2() {
boost::filesystem::path path(boost::filesystem::initial_path() / _parameterFileName);
_baseNode = YAML::LoadFile(_parameterFileName);
_baseNode["chip"]["clock_rate"]["3"] = 5.4;
std::cout << _baseNode << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
对于我的第二次尝试,我创建了一个YAML::Node& baseNode:
YAML::Node& baseNode = YAML::LoadFile(_parameterFileName);
Run Code Online (Sandbox Code Playgroud)
但后来我收到这个错误:
invalid initialization of non-const reference of type 'YAML::Node&' from an rvalue of type 'YAML::Node'
Run Code Online (Sandbox Code Playgroud)
对于那些感兴趣的人,.yaml文件看起来像这样:
chip:
clock_rate:
0: 1.0
1: 1.0
2: 1.0
3: 3.0
4: 1.0
Run Code Online (Sandbox Code Playgroud)
我想将映射的值3从3.0 更改为5.4.
给定以下 example.yaml 文件:
Foo:
id: 10
name: "bob"
Run Code Online (Sandbox Code Playgroud)
使用 yaml-cpp,如何获得键名“Foo”?
给出代码:
YAML::Node doc = YAML::LoadFile("sample.yaml");
cout << "doc.Type(): " << doc.Type() << "\n";
cout << "doc.size(): " << doc.size() << "\n";
cout << "doc[Foo][id]: " << doc["Foo"]["id"] << "\n";
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,Type() 是 4(Map)(Foo 是一个 Map)。
size() 正如预期的那样为 1(Foo 是文档中唯一的项目)。
doc[Foo][id] 正如预期的那样是 10。
但我似乎无法弄清楚如何从文档的一个节点中找到“Foo”。迭代 doc 会生成一个 Node,但其大多数操作都会引发异常。
我有一个小但复杂的树结构。使用 boost 属性树作为容器,我尝试迭代该树,然后使用yaml-cpp库将其发送到 yaml 文件。
例如,我有一个小的嵌套属性树:
fibonacci:
type: series
entities:
golden_ratio:
ratio: 2.3
function:
power_series: 2
Run Code Online (Sandbox Code Playgroud)
我希望我的 yaml 文件看起来像这样。
我编写了一个递归函数来迭代树并发送到 yaml。
//Member variable
YAML::Emitter m_out
void iterator(const boost::property_tree::ptree& tree, const std::string& key)
{
for (const auto& item: tree)
{
if (item.second.data().empty()) //check if map node
{
m_out << YAML::BeginMap;
m_out << YAML::Key << item.first;
}
else if (!item.second.data().empty()) //else it is key/value pair
{
m_out << YAML::Key << item.first;
m_out << YAML::Value << item.second.data();
}
if (!item.second.empty()) //If …Run Code Online (Sandbox Code Playgroud) 我发现从yaml文件获取十六进制值时出现问题.它无法获得十六进制值0x80000000及以上.以下是一个示例C++程序.
// ymlparser.cpp
#include <iostream>
#include <fstream>
#include "yaml-cpp/yaml.h"
int main(void)
{
try {
std::ifstream fin("hex.yaml");
YAML::Parser parser(fin);
YAML::Node doc;
parser.GetNextDocument(doc);
int num1;
doc["hex1"] >> num1;
printf("num1 = 0x%x\n", num1);
int num2;
doc["hex2"] >> num2;
printf("num2 = 0x%x\n", num2);
return 0;
} catch(YAML::ParserException& e) {
std::cout << e.what() << "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
hex.yaml
hex1: 0x7FFFFFFF
hex2: 0x80000000
Run Code Online (Sandbox Code Playgroud)
错误信息在这里.
$ ./ymlparser
num1 = 0x7fffffff
terminate called after throwing an instance of 'YAML::InvalidScalar'
what(): yaml-cpp: error at line 2, column 7: invalid …Run Code Online (Sandbox Code Playgroud) 我试图在我的项目中使用yaml-cpp。通过尝试以下名称,我花了半个小时才正确链接库。在我最终在这个文件中偶然发现它们之后,我解决了这个问题:
find_package(yaml-cpp REQUIRED)
include_directories(${YAML_INCLUDE_DIRS})
target_link_libraries(${YAML_CPP_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
它有效,但我寻找那些的方式似乎很愚蠢。
如何远程找出包含变量的正确名称?可能是YAML_LIBS, YAML_LIBRARY, YAML_CPP_LIBRARIES, 没有标准吧?为大多数 C++ 库确定正确的 cmake 配置的适当方法是什么?
谢谢你。
考虑以下代码 (yamltest.cpp):
#include <yaml-cpp/yaml.h>
#include <iostream>
#include <string>
int main() {
std::string val = "[1, 2, 3]";
YAML::Node yn0 = YAML::Load(val);
YAML::Node yn1 = YAML::Load(val);
std::cout << "===== yn0 =====\n" << yn0 << std::endl;
std::cout << "\n" << std::endl;
std::cout << "===== yn1 =====\n\n" << yn1 << std::endl;
std::cout << std::boolalpha;
std::cout << "yn0 == yn0: " << (yn0==yn0) << std::endl;
std::cout << "yn1 == yn1: " << (yn1==yn1) << std::endl;
std::cout << "yn0 == yn1: " << (yn0==yn1) << …Run Code Online (Sandbox Code Playgroud)