You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中使用YamlDotNet解析YAML流时保留注释?

保留YAML注释的YamlDotNet解决方案

是的,YamlDotNet完全可以实现读写YAML时保留原有注释的需求——你之前的代码丢失注释,是因为默认的序列化器没有启用注释输出功能,而实际上YamlStream加载YAML时已经把注释信息保存到了节点的属性中。

问题根源

当你用YamlStream.Load()加载YAML时,解析器会自动将注释关联到对应的YamlNode上,这些注释存储在节点的Comments属性里(包括行内注释、节点前/后的注释)。但默认构建的Serializer并不会读取这些注释属性,所以序列化时自然就丢失了。

解决方案步骤

要保留注释,你只需要在构建序列化器时启用注释输出,或者直接使用YamlStream的保存方法来写入文件。

方法1:使用带注释支持的序列化器

修改你的序列化代码,通过SerializerBuilder添加WithComments()配置,让序列化器识别并输出节点上的注释:

var input = new StringReader(Document);
var yaml = new YamlStream();
yaml.Load(input);
var document = (YamlMappingNode)yaml.Documents[0].RootNode;

// 这里执行你的节点修改操作,比如更新phone字段
var usersNode = (YamlSequenceNode)document["users"];
var firstUser = (YamlMappingNode)usersNode[0];
firstUser["phone"] = new YamlScalarNode("123456789");

// 构建支持注释的序列化器
var serializer = new SerializerBuilder()
    .WithIndentation(2) // 保持原有的缩进格式
    .WithComments() // 启用注释输出
    .Build();

var updatedYaml = serializer.Serialize(document);
Console.WriteLine(updatedYaml);

方法2:直接使用YamlStream保存文件

如果你需要直接写入文件,也可以用YamlStream.Save()方法,它会自动保留加载时解析到的注释:

var input = new StringReader(Document);
var yaml = new YamlStream();
yaml.Load(input);
var document = (YamlMappingNode)yaml.Documents[0].RootNode;

// 执行节点修改操作...

// 写入文件,确保保留注释
using var outputWriter = new StreamWriter("updated.yaml");
var emitterSettings = new EmitterSettings { Indentation = 2 };
var emitter = new Emitter(outputWriter, emitterSettings);
yaml.Save(emitter, emitStartDocument: true);

验证效果

对于你提供的示例YAML,执行上述代码后,输出会保留# comment that needs to be preserved这个行内注释,同时包含你修改后的内容。

需要注意的是:如果你的YAML包含文档级别的注释(比如文件开头的注释),这些注释会存储在yaml.Documents[0].Comments中,上述两种方法也会一并保留。

内容的提问来源于stack exchange,提问作者Sharan_Babu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 11:57:55