c# - 如何在C#中删除Yaml文件末尾的3个点?

标签 c# .net yaml file-processing yamldotnet

我正在使用 YamlDotNet Nuget-package 在 C#/.Net Framework 中读取和写入 Yaml 文件。在编写 yaml 文件时,它会在文件末尾创建 3 个点。由于这些点是可选的,所以我不需要它们。有没有办法在创建 yaml 文件时排除它们? 这是我的代码。

   using YamlDotNet.RepresentationModel;

        var input = new StreamReader(Constants.YamlFilePath);
        var yaml = new YamlStream(); 
        yaml.Load(input);
        input.Dispose();
        var config = ((YamlMappingNode)yaml.Documents[0].RootNode).Children["Configuration"];
        ((YamlMappingNode)yaml.Documents[0].RootNode).Children["Configuration"] = new YamlMappingNode
        {
            { "A1", data.A1 },
            { "A2", data.A2 },
            { "A3", data.A3 },
            { "A4", config["A4"].ToString() },
            { "A5", config["A5"].ToString() }
        };

        using (StreamWriter writer = new StreamWriter(Constants.YamlFilePath, false))
            yaml.Save(writer);

最佳答案

目前,YamlStream 始终发出显式 DocumentEnd 事件,这就是写入点的原因。您无法更改该行为,但可以编写自己的 IEmitter 来强制 DocumentEnd 事件为隐式:

public class NoDotsEmitter : IEmitter
{
    private readonly IEmitter inner;

    public NoDotsEmitter(IEmitter inner)
    {
        this.inner = inner;
    }

    public void Emit(ParsingEvent @event)
    {
        if (@event is DocumentEnd documentEnd)
        {
            inner.Emit(new DocumentEnd(true));
        }
        else
        {
            inner.Emit(@event);
        }
    }
}

然后您可以将此类的实例传递给 Save 方法:

var emitter = new NoDotsEmitter(new Emitter(writer));
yaml.Save(emitter, false);

您可以在此处查看一个工作示例:https://dotnetfiddle.net/2yCM2K

关于c# - 如何在C#中删除Yaml文件末尾的3个点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59338063/

相关文章:

c# - 使用单点登录机制创建 Web 服务的选项有哪些?

c# - 如何确定 Socket.Listen() 的 MaxConnections?

json - 通过变量将 JSON 传递给 YAML

c# - 使用 HTTP GET 配置 WCF 客户端以使用 WCF 服务

c# - 从调用的 WebMethod 更新 UpdatePanel

c# - 从类函数获取回调

c# - 在集合中找出比它们大的数

c# - Newtonsoft.Json.Schema.JsonSchema 已过时?

包含引用插入的 YAML 缩小算法

amazon-web-services - CloudFormation 模板无效 : Template format error: Every Outputs member must contain a Value object