Чтение Ямлдо tnet с c# - PullRequest
0 голосов
/ 26 мая 2020

У меня возникают некоторые проблемы, когда я пытаюсь прочитать файл Yaml, используя c#, и мне нужна помощь для завершения sh этой задачи, как я могу прочитать такой файл Yaml в переменных, чтобы я мог их лечить.

FileConfig: 
  sourceFolder: /home
  destinationFolder: /home/billy/my-test-case
  scenarios: 
  - name: first-scenario 
    alterations: 
    - tableExtension: ln
      alterations: 
      - type: copy-line
        sourceLineIndex: 0
        destinationLineIndex: 0
      - type: cell-change
        sourceLineIndex: 0
        columnName: FAKE_COL
        newValue: NEW_Value1
    - tableExtension: env
      alterations: 
      - type: cell-change
        sourceLineIndex: 0
        columnName: ID
        newValue: 10

Вот мой код

string text = System.IO.File.ReadAllText(@"test.yaml");

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



1 Ответ

1 голос
/ 27 мая 2020

Самый простой способ - создать C# модель вашего документа. Затем вы можете использовать Deserializer, чтобы заполнить эту модель данными, представленными в документе. Возможная модель для вашего документа:

public class MyModel
{
    [YamlMember(Alias = "FileConfig", ApplyNamingConventions = false)]
    public FileConfig FileConfig { get; set; }
}

public class FileConfig
{
    public string SourceFolder { get; set; }
    public string DestinationFolder { get; set; }
    public List<Scenario> Scenarios { get; set; }
}

public class Scenario
{
    public string Name { get; set; }
    public List<Alteration> Alterations { get; set; }
}

public class Alteration
{
    public string TableExtension { get; set; }
    public List<TableAlteration> Alterations { get; set; }  
}

public class TableAlteration
{
    public string Type { get; set; }
    public int SourceLineIndex { get; set; }
    public int DestinationLineIndex { get; set; }
    public string ColumnName { get; set; }
    public string NewValue { get; set; }
}

Вы можете выполнить десериализацию в эту модель следующим образом:

var deserializer = new DeserializerBuilder()
    .WithNamingConvention(CamelCaseNamingConvention.Instance)
    .Build();

var obj = deserializer.Deserialize<MyModel>(yaml);

Вы можете запустить этот код здесь: https://dotnetfiddle.net/SRABFM

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

...