C# 在yaml中解析注释

C# 在yaml中解析注释,c#,yaml,yamldotnet,C#,Yaml,Yamldotnet,我需要解析包含注释的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_Na

我需要解析包含注释的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; }
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用YamlDotNet.Core;
使用YamlDotNet.Serialization;
使用YamlDotNet.Serialization.NamingConventions;
名称空间YamlTesting
{
公共类配置读取器
{
私有静态字符串_filePath=string.Empty;
私有静态工作流_Workflows=null;
公共静态void Main()
{
_filePath=“D:\\testdata.yaml”;
如果(!File.Exists(_filePath))
{
抛出new FileNotFoundException(“缺少文件:检查工作流文件的源文件夹”);
}
尝试
{
使用(var input=File.OpenText(_filePath))
{
var parser=new parser(新扫描器(newstreamreader(_filePath),skipComments:false));
var deserializer=新的DeserializerBuilder()
.WithNamingConvention(新CamelCaseNamingConvention())
.Build();
_工作流=反序列化器。反序列化(解析器);
}
}
捕获(SyntaxerRoRexE)
{
抛出新异常(“Sytanx错误:检查工作流文件中的语法。”,e);
}
捕获(Yamlexe)
{
抛出新异常(“识别的工作流无效。请检查工作流文件。”,e);
}
}
}
公共类工作流
{
[YamlMember(别名=“先决条件\服务”,ApplyNamingConventions=false)]
公共列表先决条件服务{get;set;}
[YamlMember(Alias=“Workflows”,ApplyNamingConventions=false)]
公共列表工作流{get;set;}
}
公共类工作流
{
[YamlMember(Alias=“Workflow”,ApplyNamingConventions=false)]
公共字符串WorkflowName{get;set;}
[YamlMember(别名=“服务”,ApplyNamingConventions=false)]
公共列表服务{get;set;}
}
公务舱女服务员
{
[YamlMember(别名=“服务名称”,ApplyNamingConventions=false)]
公共字符串ServiceName{get;set;}
}
我在运行上述代码“获取注释而非标量”时出错,
如何读取注释?我需要这些注释,因为这是配置文件,我需要替换它,并且我不能忽略注释

反序列化程序不知道如何处理注释。如果确实需要保留注释,我们必须直接使用IParser解析流。您可能可以扩展反序列化程序以能够识别注释,但您会遇到一个问题,那就是它需要一些地方来存储它们。

反序列化程序不知道如何处理注释。如果您确实需要保留注释,我们必须直接使用IParser解析流。您可能会扩展反序列化程序以识别注释,但您会ld的问题是,它需要一些地方来存储它们。

我无法解析注释,因此我添加了我在另一次文件讨论中发现的以下代码:

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());
}
public void AddNotParsedData(字符串fich)
{
string[]full_file=file.ReadAllLines(fich);
列表l=新列表();
l、 AddRange(完整的_文件);
l、 插入(0,“注释1”);
l、 插入(9,“注释2”);
File.writeAllines(fich,l.ToArray());
}

这不是动态的,但它是一种变通方法,可用于yaml始终采用相同格式的情况。

我无法解析注释,因此我添加了我在另一次文件讨论中发现的以下代码:

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());
}
public void AddNotParsedData(字符串fich)
{
string[]full_file=file.ReadAllLines(fich);
列表l=新列表();
l、 AddRange(完整的_文件);
l、 插入(0,“注释1”);
l、 插入(9,“注释2”);
File.writeAllines(fich,l.ToArray());
}

这不是动态的,但它是一种变通方法,可用于yaml始终具有相同格式的情况。

注释将非yaml数据转换为非yaml数据。您可以构建预处理器(只需删除第0列中的
#
),但这可能与其他(正版)数据冲突注释。还有,你想把这些行写回去吗?作为注释?是的,我想把它写回去作为注释。所以这不是一个yaml问题……也许简单的字符串操作或正则表达式是一个选项。@HenkHolterman谢谢你让我知道,这是打字错误,我已经更正了it@HenkHolterman我不能使用字符串操作,因为我将有新的配置文件我需要合并两个yaml文件,并且必须保留注释注释。注释会生成非yaml数据。您可以构建预处理器(只需删除第0列中的
#
),但这可能与其他注释冲突(正版)注释。还有,你想把这些行写回去吗?作为注释?是的,我想把它写回去作为注释。所以这不是一个yaml问题……也许简单的字符串操作或正则表达式是一个选项。@HenkHolterman谢谢你让我知道,这是打字错误,我已经更正了it@HenkHolterman我不能使用字符串操作,因为我将有新的配置文件我将被要求合并两个yaml文件,并且必须保留注释