使用 YamlDotNet 删除 yaml 文件的特定字段
Remove specific field of yaml file using YamlDotNet
我正在开发一个读取 yaml 文件的应用程序。假设 yaml 文件具有以下内容:
field1: 'test1'
field2: 'test2'
field3: 'test3'
所以我只想删除 filed2,这样新的 yaml 文件将是:
field1: 'test1'
field3: 'test3'
我如何使用 YamlDotNet 库来实现?
使用 YamlDotNet 进行反序列化和序列化可能如下所示:
const string yml = @"
field1: 'test1'
field2: 'test2'
field3: 'test3'";
// deserialize yml into dictionary
var deserialized = new DeserializerBuilder()
.Build()
.Deserialize<Dictionary<string, string>>(yml);
// remove item with key = "field2"
deserialized.Remove("field2");
// serialize filtered dictionary to yml
var finalYml = new SerializerBuilder()
.WithEventEmitter(nextEmitter => new QuoteSurroundingEventEmitter(nextEmitter))
.Build()
.Serialize(deserialized);
我们需要这个 class 用于 '
的周围值
public class QuoteSurroundingEventEmitter : ChainedEventEmitter
{
private int _itemIndex;
public QuoteSurroundingEventEmitter(IEventEmitter nextEmitter) : base(nextEmitter) { }
public override void Emit(ScalarEventInfo eventInfo, IEmitter emitter)
{
if (eventInfo.Source.StaticType == typeof(object) && _itemIndex++ % 2 == 1)
{
eventInfo.Style = ScalarStyle.SingleQuoted;
}
base.Emit(eventInfo, emitter);
}
}
代码已使用 YamlDotNet 11.2.1 在 Core 5 控制台应用程序中进行测试。
我正在开发一个读取 yaml 文件的应用程序。假设 yaml 文件具有以下内容:
field1: 'test1'
field2: 'test2'
field3: 'test3'
所以我只想删除 filed2,这样新的 yaml 文件将是:
field1: 'test1'
field3: 'test3'
我如何使用 YamlDotNet 库来实现?
使用 YamlDotNet 进行反序列化和序列化可能如下所示:
const string yml = @"
field1: 'test1'
field2: 'test2'
field3: 'test3'";
// deserialize yml into dictionary
var deserialized = new DeserializerBuilder()
.Build()
.Deserialize<Dictionary<string, string>>(yml);
// remove item with key = "field2"
deserialized.Remove("field2");
// serialize filtered dictionary to yml
var finalYml = new SerializerBuilder()
.WithEventEmitter(nextEmitter => new QuoteSurroundingEventEmitter(nextEmitter))
.Build()
.Serialize(deserialized);
我们需要这个 class 用于 '
public class QuoteSurroundingEventEmitter : ChainedEventEmitter
{
private int _itemIndex;
public QuoteSurroundingEventEmitter(IEventEmitter nextEmitter) : base(nextEmitter) { }
public override void Emit(ScalarEventInfo eventInfo, IEmitter emitter)
{
if (eventInfo.Source.StaticType == typeof(object) && _itemIndex++ % 2 == 1)
{
eventInfo.Style = ScalarStyle.SingleQuoted;
}
base.Emit(eventInfo, emitter);
}
}
代码已使用 YamlDotNet 11.2.1 在 Core 5 控制台应用程序中进行测试。