C# 中的 YAML 解析器
一个几乎功能完整的 YAML 解析器。
引言
YAML 是一种对人类友好的、跨语言的、基于 Unicode 的数据序列化语言,围绕敏捷编程语言的常见原生数据类型设计。它广泛适用于编程需求,从配置文件到互联网消息传递,再到对象持久化和数据审计。
访问 官方 YAML 网站 以获取更多信息。
YAML 基础
YAML 文件可以包含零个或多个 YAML 文档,这些文档由文档标记分隔。YAML 文档包含一个根 DataItem
。DataItem
有三种类型:标量、序列和映射。DataItem
可以嵌套以形成结构化数据。
每种 DataItem
类型都有几种格式化样式,以提高人类可读性。
一些规则
- 块样式项目可以嵌套到块样式项目,但不能嵌套到流样式项目。
- 流样式项目可以嵌套到块样式项目或流样式项目。
- 块结构由缩进表示。
- 所有缩进仅使用空格字符,不允许使用制表符。
以下是一些示例
块标量
文字文本
|
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,修复了一些解析器错误。