Introduction
YAML is a human-friendly, cross language, Unicode based data serialization language designed around the common native data types of agile programming languages. It is broadly useful for programming needs ranging from configuration files to Internet messaging to object persistence to data auditing.
Visit the official YAML website for more information.
YAML Basics
A YAML file may contain zero or more YAML documents, separated by document markers. A YAML document contains one root DataItem
. There are three types of DataItem
s: Scalar, Sequence, and Mapping. DataItem
s may be nested to form structured data.
Each DataItem
type has several formatting styles for good human readability.
Some rules:
- A block style item can be nested to a block style item but not a flow style item.
- A flow style item can be nested to either a block style or a flow style item.
- Block structure is denoted by indentation.
- All indentations only use space char, tab is not allowed.
Here are some examples:
Block Scalar
Literal Text
|
The text using
literal style.
|
|-
The text using
literal style.
|
"The text using\nliteral style.\n" | "The text using\nliteral style." |
Folded Text
>
The text using
folded style.
|
>-
The text using
folded style.
|
"The text using folded style.\n" | "The text using folded style." |
Flow Scalar
Plain Text
|
- Can not start with
,[]{}#&*!|>'\"%@` - Can start with
-?: followed by non space char - "
: " and " # " cannot appear in between
|
'Single Quoted Text'
|
- Line breaks are folded
- "
' " is escaped with "'' "
|
"Double Quoted Text"
|
- Line breaks are folded
- Escape sequences can be used
|
Sequence
Block Sequence |
- Item one
- Item two
- Item three
|
Flow Sequence |
[Item one, Item two,
Item three]
|
Mapping
Block Mapping |
Key1: Item one
Key2: Item two
? Key3
: Item three
|
Flow Mapping |
{Key1: Item one, Key2: Item two,
Key3: Item three}
|
Other
Anchor and Alias
Key1: &items
A: Item A
B: Item B
Key2: *items
|
Key1:
A: Item A
B: Item B
Key2:
A: Item A
B: Item B
|
Comment
# whole line comment
Data Item # inline comment
|
Background
There is already a Yaml Library for .NET project, but the features supported are limited.
Using the Code
The parser code is generated using a homemade tool based on grammar specified in the YAML.PEG.txt file. This grammar is not completely equal to the official YAML specification. Here are some differences:
A separator “,
” is not allowed following the last entry of Sequence or Mapping in this parser. The 32-bit Unicode escape sequence “U
” (ns-hex-digit × 8) is not supported.
The parser can be used like this:
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)
{
}
}
else
{
MessageBox.Show(parser.GetEorrorMessages());
}
Or:
YamlStream yamlStream = YamlParser.Load(yamlFilePath);
Points of Interest
The main shortcoming of this parser is that error messages are not intuitive. You are welcome to give suggestions.
History
- 2008-08-21: Article submitted.
- 2011-02-16: Redesigned the UI, fixed some parser bugs.