寻求使用c#读取.yaml文件的指导

本文关键字:文件 yaml 读取 | 更新日期: 2023-09-27 18:16:17

两个月后:我试图解析的YAML(《星战前夜》蓝图。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'.

当传递"items"作为参数给YamlScalarNode()时,它只是抱怨项目不存在,这是预期的。因为我不确定我的toughttrain在哪里出了问题,我希望有一点帮助如何进一步解决这个问题。

寻求使用c#读取.yaml文件的指导

您的问题已经得到了正确的回答,但我想指出的是,您的方法可能不是解析文件的最佳方法。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;
}

一行代码中包含了太多内容。在一行中创建一个新的YamlScalarNode对象,在另一行中访问数组,在另一行中转换生成的对象。这样,您就可以将问题范围缩小到单个步骤。

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

这有点蠢…创建一个只包含一个元素的映射是有点困难的。我编辑了OP中链接的repo与一个工作示例,以防有人遇到同样的问题。