从c#动态构建Yaml文档

是否可以使用Yaml.DotNet或其他库从c#动态构建Yaml文档?

我理解如何使用序列化来完成,但是这需要从对象结构开始。

我正在寻找一种方法来动态创建Yaml文档节点,就像使用XElement.Add(object)方法的Xml一样。

你可以使用YamlDotNet来做到这一点。 首先创建一个YamlStream ,向其中添加一个或多个文档 ,然后可以向其中添加序列 , 映射和标量 。

以下是如何执行此操作的示例 :

var address = new YamlMappingNode( new YamlScalarNode("street"), new YamlScalarNode("123 Tornado Alley\nSuite 16") { Style = YamlDotNet.Core.ScalarStyle.Literal }, new YamlScalarNode("city"), new YamlScalarNode("East Westville"), new YamlScalarNode("state"), new YamlScalarNode("KS") ) { Anchor = "main-address" }; var stream = new YamlStream( new YamlDocument( new YamlMappingNode( new YamlScalarNode("repeipt"), new YamlScalarNode("Oz-Ware Purchase Invoice"), new YamlScalarNode("date"), new YamlScalarNode("2007-08-06"), new YamlScalarNode("customer"), new YamlMappingNode( new YamlScalarNode("given"), new YamlScalarNode("Dorothy"), new YamlScalarNode("family"), new YamlScalarNode("Gale") ), new YamlScalarNode("items"), new YamlSequenceNode( new YamlMappingNode( new YamlScalarNode("part_no"), new YamlScalarNode("A4786"), new YamlScalarNode("descrip"), new YamlScalarNode("Water Bucket (Filled)"), new YamlScalarNode("price"), new YamlScalarNode("1.47"), new YamlScalarNode("quantity"), new YamlScalarNode("4") ), new YamlMappingNode( new YamlScalarNode("part_no"), new YamlScalarNode("E1628"), new YamlScalarNode("descrip"), new YamlScalarNode("High Heeled \"Ruby\" Slippers"), new YamlScalarNode("price"), new YamlScalarNode("100.27"), new YamlScalarNode("quantity"), new YamlScalarNode("1") ) ), new YamlScalarNode("bill-to"), address, new YamlScalarNode("ship-to"), address, new YamlScalarNode("specialDelivery"), new YamlScalarNode("Follow the Yellow Brick\n" + "Road to the Emerald City.\n" + "Pay no attention to the\n" + "man behind the curtain.") { Style = YamlDotNet.Core.ScalarStyle.Literal } ) ) ); 

我现在已经研究了如何使用Yaml.Net来做到这一点。 YamlStream需要使用Load()方法加载一些初始内容。

 const string initialContent = "---\nversion: 1\n..."; var sr = new StringReader(initialContent); var stream = new YamlStream(); stream.Load(sr); 

然后,您可以将YamlDocument的RootNode强制转换为具有Add方法的YamlMappingNode。

 var rootMappingNode = (YamlMappingNode)stream.Documents[0].RootNode; rootMappingNode.Add("shout", "yay!"); 

然后,您可以在保存之前添加各种节点类型:

 var props = new YamlMappingNode(); props.Add("prop1", "value1"); props.Add("prop2", "value2"); rootMappingNode.Add("itemWithProps", props); var props2 = new YamlMappingNode(); props2.Add("prop1", "value1"); props2.Add("prop2", "value2"); var props3 = new YamlMappingNode(); props3.Add("prop1", "value1"); props3.Add("prop2", "value2"); var seq = new YamlSequenceNode(); seq.Add(props2); seq.Add(props3); rootMappingNode.Add("sequenceOfItems", seq); var col = new YamlSequenceNode(); col.Style = SequenceStyle.Flow; col.Add("a"); col.Add("b"); col.Add("c"); var seqMapping = new YamlMappingNode(); seqMapping.Add("collection", col); seq.Add(seqMapping); using (TextWriter writer = File.CreateText("C:\\temp\\test.yaml")) stream.Save(writer, false); 

此示例的输出是:

 version: 1 shout: yay! itemWithProps: prop1: value1 prop2: value2 sequenceOfItems: - prop1: value1 prop2: value2 - prop1: value1 prop2: value2 - collection: [a, b, c] ... 

感谢@Antoine Aubry创建Yaml.Net并模糊地指向我正确的方向。