2016-05-09 12 views
6

Có thể xây dựng tài liệu Yaml động từ C# bằng Yaml.DotNet hoặc thư viện khác không?Xây dựng tài liệu Yaml động từ C#

Tôi hiểu làm thế nào điều này có thể được thực hiện bằng cách sử dụng serialization, tuy nhiên điều đó đòi hỏi phải bắt đầu với một cấu trúc đối tượng.

Tôi đang tìm cách tìm cách tạo các nút tài liệu Yaml khi đang di chuyển với Xml bằng phương pháp XElement.Add (đối tượng) chẳng hạn.

Trả lời

3

Bạn có thể thực hiện việc đó bằng cách sử dụng YamlDotNet. Bạn bắt đầu bằng cách tạo một YamlStream, thêm một hoặc nhiều document vào nó, sau đó bạn có thể thêm sequences, mappingsscalars vào đó.

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

Bạn có thể cung cấp ví dụ không? Tôi không thể thấy bất kỳ phương pháp nào để thêm mọi thứ vào tài liệu. – sparkplug

+0

Tôi biết, cú pháp này hút. Pull-yêu cầu được chào đón! –

+0

Cảm ơn ví dụ - Tôi đã không nghĩ rằng để vượt qua các nút vào constructor. Yêu cầu kéo hiện nằm trong danh sách việc cần làm của tôi. – sparkplug

2

bây giờ tôi đã làm việc ra làm thế nào để làm điều này bằng Yaml.Net. YamlStream cần được tải với một số nội dung ban đầu bằng cách sử dụng phương thức Load().

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

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

Sau đó, bạn có thể truyền RootNode của YamlDocument thành YamlMappingNode có phương thức Thêm.

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

Sau đó bạn có thể thêm nhiều kiểu nút trước khi lưu:

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

Kết quả của ví dụ này là:

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

Nhờ @Antoine Aubry để tạo Yaml.Net và mơ hồ chỉ tôi đi đúng hướng.

Các vấn đề liên quan