4

この形式の 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
        }
    }

これは処理が非常に簡単なはずですが、私を夢中にさせています!

4

4 に答える 4

-1

次のようなことを試してください:

- Foo: {}
- Bar:
  b1: 15
于 2014-03-17T22:33:55.193 に答える