2016-05-09 21 views
6

Yaml.DotNet veya başka bir kütüphaneyle dinamik olarak bir Yaml dokümanı oluşturmak mümkün mü?Dinamik olarak bir Yaml belgesi oluşturun C#

Bunun nasıl bir serileştirme kullanılarak yapılabileceğini anlıyorum, ancak bunun için bir nesne yapısıyla başlamanız gerekiyor.

Örneğin XElement.Add (object) yöntemini kullanarak Xml ile yaptığınız gibi Yaml belge düğümlerini anında oluşturmak için bir yol bulmak için arıyorum.

cevap

3

Bunu YamlDotNet kullanarak yapabilirsiniz. Bir YamlStream oluşturarak başlarsınız, ona bir veya daha fazla document ekleyin, daha sonra buna sequences, mappings ve scalars ekleyebilirsiniz.

Here is an example on how to do it

:

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 
      } 
     ) 
    ) 
); 
+0

Örnek verebilir misiniz? Belgedeki şeyleri eklemek için herhangi bir yöntem göremiyorum. – sparkplug

+0

Biliyorum, bu sözdizimi berbat. Çek-istekleri kabul edilir! –

+0

Örnek için teşekkürler - Düğümü yapıcıya iletmeyi düşünmedim. Çekme isteği şimdi yapılacaklar listemde. – sparkplug

2

Şimdi bu kullanarak Yaml.Net nasıl yapılacağını çalıştık. YamlStream'in Load() yöntemini kullanarak bazı ilk içerikle yüklenmesi gerekir.

const string initialContent = "---\nversion: 1\n..."; 

var sr = new StringReader(initialContent); 
var stream = new YamlStream(); 
stream.Load(sr); 

Daha sonra, bir Add yöntemi vardır YamlMappingNode için YamlDocument ait rootNode yayınlayabilirsiniz.

var rootMappingNode = (YamlMappingNode)stream.Documents[0].RootNode; 
rootMappingNode.Add("shout", "yay!"); 
Daha sonra kaydetmeden önce düğüm türleri çeşitli ekleyebilir

:

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); 

Bu örnekte çıktısı şu şekildedir:

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

Teşekkür @Antoine Aubry ile Yaml.Net oluşturmak için ve belli belirsiz şekilde doğru yönde işaret ediyor.

İlgili konular