使用YamlDotnet在C#中修改YAML配置并保留注释的方法求助
YamlDotnet在C#中修改YAML配置并保留注释的方法求助
兄弟,我之前也碰到过一模一样的问题!用常规的反序列化转成实体类再写回去,注释肯定会丢——毕竟注释不属于你的数据模型内容嘛~别担心,用YamlDotNet的低级节点API就能完美解决,直接操作YAML的节点树,既能修改指定字段,又能保留所有注释、空行和原格式,给你分享具体的实现步骤和代码:
核心思路
常规的Deserialize<T>方法会把YAML内容转成你定义的实体对象,这个过程会丢弃注释、格式这些非数据信息。我们需要用YamlDotNet的YamlStream来解析整个YAML文档,它会保留所有节点(包括注释、缩进、空行),然后直接找到目标节点修改值,最后再把整个节点树写回文件。
具体代码实现
首先确保你已经通过NuGet安装了YamlDotNet包,然后可以用下面的代码:
using System.IO; using YamlDotNet.RepresentationModel; using YamlDotNet.Core; // 1. 读取原YAML文件,保留所有节点和注释 var yamlStream = new YamlStream(); using (var reader = new StreamReader("你的配置文件路径.yaml")) { yamlStream.Load(reader); } // 2. 定位到要修改的age字段 // 获取文档根节点(假设根节点是一个映射节点) var rootMapping = yamlStream.Documents[0].RootNode as YamlMappingNode; if (rootMapping == null) { // 处理根节点不是映射的情况 return; } // 找到person节点 if (rootMapping.TryGetNode("person", out var personNode) && personNode is YamlMappingNode personMapping) { // 修改age的值,这里可以根据需求设置成int或字符串,YamlScalarNode会自动处理 personMapping["age"] = new YamlScalarNode(25); // 比如把年龄改成25 } // 3. 写回文件,保留原格式 using (var writer = new StreamWriter("修改后的配置文件路径.yaml")) { var emitterSettings = new EmitterSettings { Indent = 2, // 和原文件保持一致的缩进 PrettyFlow = true, Canonical = false }; yamlStream.Save(writer, emitterSettings); }
注意事项
- 如果你的YAML结构更复杂(比如person是数组中的元素),只需要调整节点遍历的逻辑,找到对应的目标节点即可
- 修改值的时候,
YamlScalarNode可以接受字符串、数字等类型,会自动匹配YAML的格式 - 写回文件时的
EmitterSettings建议和原文件的格式保持一致,避免出现不必要的格式变化
这样操作之后,你的YAML文件里的注释、空行都会完整保留,只有age字段的值被修改啦~
备注:内容来源于stack exchange,提问作者Maherz123
相关产品推荐
相关产品推荐

