65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 中的 YAML 解析器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (25投票s)

2008年8月21日

CPOL

2分钟阅读

viewsIcon

338391

downloadIcon

4534

一个几乎功能完整的 YAML 解析器。

引言

YAML 是一种对人类友好的、跨语言的、基于 Unicode 的数据序列化语言,围绕敏捷编程语言的常见原生数据类型设计。它广泛适用于编程需求,从配置文件到互联网消息传递,再到对象持久化和数据审计。

访问 官方 YAML 网站 以获取更多信息。

YAML 基础

YAML 文件可以包含零个或多个 YAML 文档,这些文档由文档标记分隔。YAML 文档包含一个根 DataItemDataItem 有三种类型:标量、序列和映射。DataItem 可以嵌套以形成结构化数据。

每种 DataItem 类型都有几种格式化样式,以提高人类可读性。

yamlDataItem.png

一些规则

  • 块样式项目可以嵌套到块样式项目,但不能嵌套到流样式项目。
  • 流样式项目可以嵌套到块样式项目或流样式项目。
  • 块结构由缩进表示。
  • 所有缩进仅使用空格字符,不允许使用制表符。

以下是一些示例

块标量

文字文本
|
The text using
literal style.
|-
The text using
literal style.
"使用\nliteral 样式的文本。\n" "使用\nliteral 样式的文本。"
折叠文本
>
The text using
folded style.
>-
The text using
folded style.
"使用 folded 样式的文本。\n" "使用 folded 样式的文本。"
流标量
Plain Text
  • 不能以 ,[]{}#&*!|>'\"%@` 开头
  • 可以以 -?: 开头,后跟非空格字符
  • ": " 和 " #" 不能出现在中间
'Single Quoted Text'
  • 换行符会被折叠
  • "'" 用 "''" 转义
"Double Quoted Text"
  • 换行符会被折叠
  • 可以使用转义序列
序列
块序列
- Item one
- Item two
- Item three
流序列
[Item one, Item two,
Item three]
映射
块映射
Key1: Item one
Key2: Item two
? Key3
: Item three 
流映射
{Key1: Item one, Key2: Item two, 
Key3: Item three} 

其他

锚点和别名
Key1: &items
  A: Item A
  B: Item B
Key2: *items
Key1:
  A: Item A
  B: Item B
Key2:
  A: Item A
  B: Item B
注释
# whole line comment
Data Item # inline comment

背景

已经有一个 .NET 的 Yaml 库 项目,但支持的功能有限。

Using the Code

解析器代码是使用基于 YAML.PEG.txt 文件中指定的语法的自制工具生成的。此语法并不完全等于 官方 YAML 规范。以下是一些差异

在此解析器中,序列或映射的最后一个条目之后不允许使用分隔符“,”。 不支持 32 位 Unicode 转义序列“U”(ns-hex-digit × 8)。

可以使用以下方式使用解析器

YamlParser parser = new YamlParser();
TextInput input = new TextInput(File.ReadAllText(yamlFilePath));
bool success;
YamlStream yamlStream = parser.ParseYamlStream(input, out success);
if (success)
{
    foreach (YamlDocument doc in yamlStream.Documents)
    {
        // access DataItem by doc.Root
    }
}
else
{
    MessageBox.Show(parser.GetEorrorMessages());
}

或者

YamlStream yamlStream = YamlParser.Load(yamlFilePath);

关注点

此解析器的主要缺点是错误消息不直观。欢迎提出建议。

历史

  • 2008-08-21:提交文章。
  • 2011-02-16:重新设计了 UI,修复了一些解析器错误。
© . All rights reserved.