2016-05-09 14 views
6

È possibile creare un documento Yaml in modo dinamico da C# con Yaml.DotNet o un'altra libreria?Creare dinamicamente un documento Yaml da C#

Capisco come questo può essere fatto utilizzando la serializzazione, tuttavia ciò richiede di iniziare con una struttura di oggetti.

Sto cercando un modo per creare i nodi del documento Yaml al volo come faresti con Xml utilizzando il metodo XElement.Add (oggetto) ad esempio.

risposta

3

È possibile farlo utilizzando YamlDotNet. Si inizia creando uno YamlStream, aggiungere uno o più document ad esso, quindi è possibile aggiungere sequences, mappings e scalars ad esso.

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

Potete fornire un esempio? Non riesco a vedere alcun metodo per aggiungere cose al documento. – sparkplug

+0

Lo so, questa sintassi fa schifo. Le richieste di pull sono benvenute! –

+0

Grazie per l'esempio: non pensavo di passare il nodo nel costruttore. Una richiesta di pull è ora nella mia lista di cose da fare. – sparkplug

2

ora ho trovato il modo di farlo usando Yaml.Net. Lo YamlStream deve essere caricato con del contenuto iniziale usando il metodo Load().

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

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

È possibile quindi lanciare l'RootNode del YamlDocument a YamlMappingNode che ha un metodo Add.

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

È quindi possibile aggiungere una varietà di tipi di nodi prima di salvare:

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

L'output di questo esempio è:

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

Grazie a @Antoine Aubry per la creazione Yaml.Net e indicandomi vagamente nella giusta direzione.

Problemi correlati