Разбирать комментарии в yaml

У меня есть требование разбора документов yaml, включая комментарии, мой файл yaml выглядит следующим образом

Prerequisite_Services:
- Service_Name: abc
Workflows:
- Workflow: workflow1
  Service:
  - Service_Name: abc1
  - Service_Name: abc2
# - Service_Name: abc3
- Workflow: xyz
  Service:
  - Service_Name: def1
  - Service_Name: def2
  - Service_Name: def3
  - Service_Name: def4
# - Service_Name: def5
  - Service_Name: def6

мне нужно разобрать обе службы abc3 и def5 я попробовал ниже коды

using System;
using System.Collections.Generic;
using System.IO;
using YamlDotNet.Core;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
namespace YamlTesting
{
public class ConfigReader
{
    private static string _filePath = string.Empty;
    private static Workflows _workFlows = null;

    public static void Main()
    {
        _filePath = "D:\\testdata.yaml";
        if (!File.Exists(_filePath))
        {
            throw new FileNotFoundException("Missing File : Check the source folder for Workflow file.");
        }
        try
        {
            using (var input = File.OpenText(_filePath))
            {
                var parser = new Parser(new Scanner(new StreamReader(_filePath), skipComments: false));
                var deserializer = new DeserializerBuilder()
                    .WithNamingConvention(new CamelCaseNamingConvention())
                    .Build();
                _workFlows = deserializer.Deserialize<Workflows>(parser);
            }
        }

        catch (SyntaxErrorException e)
        {
            throw new Exception("Sytanx Error : Check the syntax in the Workflow file.", e);
        }
        catch (YamlException e)
        {
            throw new Exception("Invalid workflow identified. Check the Workflow file.", e);
        }
    }
}

public class Workflows
{
    [YamlMember(Alias = "Prerequisite_Services", ApplyNamingConventions = false)]
    public List<Servicess> PreRequisiteServices { get; set; }

    [YamlMember(Alias = "Workflows", ApplyNamingConventions = false)]
    public List<WorkFlow> WorkFlows { get; set; }
}

public class WorkFlow
{
    [YamlMember(Alias = "Workflow", ApplyNamingConventions = false)]
    public string WorkflowName { get; set; }
    [YamlMember(Alias = "Service", ApplyNamingConventions = false)]
    public List<Servicess> Service { get; set; }
}

public class Servicess
{
    [YamlMember(Alias = "Service_Name", ApplyNamingConventions = false)]
    public string ServiceName { get; set; }
}

Я получаю сообщение об ошибке при выполнении кода выше "получил комментарий вместо скаляра", как я могу прочитать комментарий? мне нужны эти комментарии, так как это файл конфигурации, и мне нужно заменить его, и я не могу игнорировать комментарии

2 ответа

Десериализатор не знает, как правильно обрабатывать комментарии. Если вам действительно нужно сохранить комментарии, вы должны проанализировать поток напрямую с помощью IParser. Возможно, вы могли бы расширить Deserializer, чтобы иметь возможность распознавать комментарии, но у вас возникнет проблема, что ему понадобится место для их хранения где-то.

Мне не удалось разобрать комментарии, поэтому я добавил следующий код, который нашел при другом обсуждении файлов:

      public void AddNotParsedData (string fich)
{
      string[] full_file = File.ReadAllLines(fich);
      List<string> l = new List<string>();
      l.AddRange(full_file);

      l.Insert(0, "Comment1");
      l.Insert(9, "Comment2");
      
      File.WriteAllLines(fich, l.ToArray());
}

Это не динамично, но это обходной путь, который можно использовать в случае, если yaml всегда имеет один и тот же формат.

Другие вопросы по тегам