7

2 か月後: 私が解析しようとした YAML (Eve Online blueprint.yaml) ファイルは大きな変更を加えたため、デシリアライザーを使用した解析もはるかに簡単になりました。(何らかの理由で) 誰かがコードを見たい場合は、https://github.com/hkraal/ParseYamlで更新されます。


Steve Wellens のコメントに基づいて、コードを調整して、一度に行うことを減らしました。エラー自体は問題ありませんでした。以前に参照した aaubry.net にある実際の例をテストするために、ソリューションに別のプロジェクト (Example1) を作成しました。

現在の結論につながる「動的」キーを使用すると、同じエラーが発生しました。次の違いがあります。

items:
    - part_no:   A4786

items:
    part_no:   A4786

最初のものは、2 番目の構文を使用している .yaml ファイルに適用できると (誤って) 仮定した例で使用されています。

yaml ファイルで使用されている構文を使用して、キーの「子」要素を取得する方法を見つける必要があります...


仕事で C# が使用されているので、言語のさまざまな側面について学びながら、直接的な目標を達成するための素晴らしいプロジェクトについて考え始めました。しかし、Yaml ファイルを解析するプロジェクトのかなり早い段階で最初の壁にぶつかっています。私の目標は、YamlBlueprint.cs で定義されているように YamlBlueprint オブジェクトのリストを作成することですが、Yaml ファイルの最後まで到達しません。

問題を示すgithubでテストケースをセットアップしました: https://github.com/hkraal/ParseYaml

http://www.aaubry.net/page/YamlDotNet-Documentation-Loading-a-YAML-streamの例は、アイテムをループするまで機能します。私が見たものに基づいて、YamlScalarNode() にパラメーターとして myKey を渡して、その下の項目にアクセスできるはずです。

var items = (YamlSequenceNode)mapping.Children[new YamlScalarNode(myKey)];

実行すると、次のエラーが発生します。

An unhandled exception of type 'System.InvalidCastException' occurred in yamldotnet.exe
Additional information: Unable to cast object of type 'YamlDotNet.RepresentationModel.YamlMappingNode' to type 'YamlDotNet.RepresentationModel.YamlSequenceNode'.

パラメータとして「アイテム」を YamlScalarNode() に渡すと、期待されるアイテムがそこにないという不平を言うだけです。私のタフトトレインがどこでうまくいかないのかわからないので、これをさらにトラブルシューティングする方法について少し助けていただければ幸いです。

4

3 に答える 3

4

あなたの質問にはすでに正しく答えられていますが、あなたのアプローチはおそらくファイルの解析には最適ではないことを指摘したいと思います。YamlDotNet.RepresentationModel.* 型は、YAML ストリームとそのさまざまな部分を直接表すオブジェクト モデルを提供します。これは、YAML ストリームを処理または生成するアプリケーションを作成する場合に役立ちます。

YAML ドキュメントをオブジェクト グラフに読み込む場合、最適な方法はDeserializerクラスを使用することです。それを使用すると、次のようにコードを記述できます。

using(var reader = File.OpenText("blueprints.yaml")
{
    var deserializer = new Deserializer();
    var blueprintsById = deserializer.Deserialize<Dictionary<int, YamlBlueprint>>(reader);

    // Use the blueprintsById variable
}

唯一の違いは、YamlBlueprintインスタンスの Id プロパティが設定されないことですが、これを追加するだけです:

foreach(var entry in blueprintsById)
{
    entry.Value.Id = entry.Key;
}
于 2014-08-04T21:07:20.470 に答える
3

1 行のコードで処理する内容が多すぎます。1 行で新しい YamlScalarNode オブジェクトを作成し、別の行で配列にアクセスし、別の行で結果のオブジェクトをキャストします。そうすれば、問題の領域を 1 つのステップに絞り込むことができます。

このメッセージは、配列から YamlMappingNode を取得しているが、それを YamlSequenceNode にキャストしていることを示しています。2 つのタイプが明らかに関連していないため、これは許可されません。

于 2014-08-02T14:54:06.883 に答える