2014-09-03 38 views
3

我想在c#中解析yaml,以獲得哈希表列表。我正在使用YamlDotNet。這是我的代碼:如何解析yaml字符串

TextReader tr = new StringReader(txtRawData.Text); 
var reader = new EventReader(new MergingParser(new Parser(tr))); 
Deserializer des = new Deserializer(); ; 
var result = des.Deserialize<List<Hashtable>>(tr); 

它不會失敗,但給我一個空對象。

我YAML是這樣的:

- Label: entry 
    Layer: x 
    id: B35E246039E1CB70 
- Ref: B35E246039E1CB70 
    Label: Info 
    Layer: x 
    id: CE0BEFC7022283A6 
- Ref: CE0BEFC7022283A6 
    Label: entry 
    Layer: HttpWebRequest 
    id: 6DAA24FF5B777506 

如何分析我的YAML並將其轉換爲所需的類型,而無需執行對我自己?

回答

6

問題中的YAML文檔格式不正確。每個鍵必須具有與前一個鍵相同的縮進。由於您提到代碼不會失敗,因此我會假設您正在解析的實際文檔格式正確。

我可以使用下面的代碼成功地解析文檔:

var deserializer = new Deserializer(); 
var result = deserializer.Deserialize<List<Hashtable>>(new StringReader(yaml)); 
foreach (var item in result) 
{ 
    Console.WriteLine("Item:"); 
    foreach (DictionaryEntry entry in item) 
    { 
     Console.WriteLine("- {0} = {1}", entry.Key, entry.Value); 
    } 
} 

This fiddle顯示,代碼工作。我從代碼中刪除了第二行,因爲它創建了一個永遠不會使用的對象。

此外,Hashtable可能不是你想要使用的。由於在.NET中引入了泛型,因此使用Dictionary要好得多。它具有類型安全性的好處。在這種情況下,您可以使用Dictionary<string, string>

+0

謝謝。我也更正了我發佈的yaml。你的方式工作正常。 – max 2014-09-04 03:29:56

+0

@antoine這仍然是有效的代碼?當我今天用最新的stable版本試用這個時,Deserialize方法(上面的第2行)拋出一個異常,聲明期望SequenceStart,但得到了MappingStart。我知道YAML很好,因爲你的YamlStream加載它就好了。這個Hashtable列表似乎很感興趣,並且很想看看它是如何翻譯YAML文件的。不用擔心,如果它不再受支持,或者只適用於非常基本的YAML文件,我只是好奇。 – 2017-10-29 00:33:46