如何在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
相关产品推荐
相关产品推荐

