Как разобрать строку yaml

Я хочу проанализировать yaml в С# таким образом, чтобы получить список хеш-таблиц. Я использую YamlDotNet. Вот мой код:

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

Это не терпит неудачу, но дает мне нулевой объект.

Мой ямл выглядит так:

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

Как мне разобрать мой yaml и преобразовать его в нужный тип без необходимости реализовывать его самостоятельно?


person max    schedule 03.09.2014    source источник


Ответы (1)


Документ 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);
    }
}

Эта скрипта показывает, что код работает. Я удалил вторую строку из вашего кода, потому что она создает объект, который никогда не используется.

Кроме того, Hashtable, вероятно, не то, что вы хотите использовать. Поскольку в .NET появились дженерики, гораздо лучше использовать Dictionary. Его преимущество заключается в безопасности типов. В этом случае вы можете использовать Dictionary<string, string>.

person Antoine Aubry    schedule 03.09.2014
comment
Спасибо. Я также исправил yaml, который я разместил. Ваш способ работает нормально. - person max; 04.09.2014
comment
@antoine Это все еще действующий код? Когда я пытаюсь сделать это сегодня с вашим последним стабильным выпуском, метод Deserialize (строка 2 выше) выдает исключение, в котором говорится, что он ожидал SequenceStart, но получил MappingStart. Я знаю, что YAML хорош, потому что ваш YamlStream прекрасно его загружает. Этот список хеш-таблиц показался интересным, и ему было любопытно посмотреть, как он перевел файл YAML. Не беспокойтесь, если он больше не поддерживается или работает только с очень простыми файлами YAML, мне просто любопытно. - person Rodney S. Foley; 29.10.2017