7

两个月后:我尝试解析的 YAML(Eve Online blueprint.yaml)文件发生了很大变化,这也使得使用反序列化器解析变得更加容易。如果有人(无论出于何种原因)想查看代码,它会在https://github.com/hkraal/ParseYaml上更新


根据 Steve Wellens 的评论,我调整了代码以减少一次做的事情。错误本身并不重要。我在我的解决方案中创建了另一个项目(Example1)来测试我之前提到的在 aaubry.net 上找到的实际示例。

使用“动态”键时,它给了我同样的错误,这导致了我目前的结论:两者之间存在差异:

items:
    - part_no:   A4786

items:
    part_no:   A4786

第一个用于我(错误地)假设我可以应用于使用第二种语法的 .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上的示例一直有效,直到我想循环遍历这些项目。根据我所看到的,我应该能够将 myKey 作为参数提供给 YamlScalarNode() 以访问它下面的项目。

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

一行代码中发生了太多事情。在一行中创建一个新的 YamlScalarNode 对象,在另一行中访问数组,在另一行中转换结果对象。这样,您就可以将问题范围缩小到一个步骤。

该消息告诉您正在从数组中检索 YamlMappingNode,但您正在将其转换为 YamlSequenceNode。这是不允许的,因为这两种类型显然不相关。

于 2014-08-02T14:54:06.883 回答
0

嗯,这有点愚蠢......创建一个只包含一个元素的东西的映射有点困难。我已经用一个工作示例编辑了 OP 中链接的 repo,以防有人遇到同样的问题。

于 2014-08-04T18:49:36.500 回答