この形式の yaml ファイルを解析する際に非常に単純な問題があります。
- Foo
- Bar:
b1: 5
トップレベルのキーを文字列、つまり「Foo」と「Bar」として解析したいと思います。ご覧のとおり、シーケンスの最初のエントリはスカラーで、2 番目のエントリは 1 つのキーと値のペアを含むマップです。この YAML テキストを config というノードにロードしたとします。次の方法で構成を反復処理します。
YAML::Node::const_iterator n_it = config.begin();
for (; n_it != config.end(); n_it++) {
std::string name;
if (n_it->Type() == YAML::NodeType::Scalar)
name = n_it->as<std::string>();
else if (n_it->Type() == YAML::NodeType::Map) {
name = n_it->first.as<std::string>();
}
}
問題は、2 番目の "Bar" エントリを解析することです。次の yaml-cpp 例外が発生し、シーケンス イテレータ n_it からキーにアクセスしようとしています。
YAML::InvalidNode: yaml-cpp: error at line 0, column 0: invalid node; this may result from using a map iterator as a sequence iterator, or vice-versa
これへのアクセスを変更すると:
name = n_it->as<std::string>();
std::string としてマップ全体にアクセスしようとしているために、別の yaml-cpp 例外が発生します。
YAML::TypedBadConversion<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >: yaml-cpp: error at line 0, column 0: bad conversion
誰かが私に何がうまくいかないのか説明してもらえますか?
編集: 新しい問題 この API のマップとシーケンスの処理にまだ問題があります。ここで、次の構造があるとします。
foo_map["f1"] = "one";
foo_map["f2"] = "two";
bar_map["b1"] = "one";
bar_map["b2"] = "two";
これを次の YAML ファイルに変換したい:
Node:
- Foo:
f1 : one
f2 : two
- Bar:
b1 : one
b2 : two
私は次のようにしてそうします:
node.push_back("Foo");
node["Foo"]["b1"] = "one";
...
node.push_back("Bar");
ただし、最後の行でノードがシーケンスからマップに変換され、例外が発生します。これを行う唯一の方法は、マップのマップを出力することです。
Node:
Foo:
f1 : one
f2 : two
Bar:
b1 : one
b2 : two
これに関する問題は、そのようなファイルを読み戻せない場合です。ノードを反復処理すると、例外を取得せずにノード イテレータの型を取得することさえできません。
YAML::Node::const_iterator n_it = node.begin();
for (; n_it != config.end(); n_it++) {
if (n_it->Type() == YAML::NodeType::Scalar) {
// throws exception
}
}
これは処理が非常に簡単なはずですが、私を夢中にさせています!