VisualBasic #7:YAML #1:読み込み方法

VBからYAMLファイルを読み込みたい。
前回記事:VisualBasic #6:プロパティ


環境

Visual Studio 2015 Community 2015
- Version 14.0.25431.01 Update 3
使用するフレームワークは .NET Framework 4.5.2

準備

例えば以下のファイル(test.yaml)を準備し
name: test
items:
- id: 1
  name: item1
  subitems:
    - name: sub1-1
- id: 2
  name: item2
  subitems:
    - name: sub2-1
    - name: sub2-2
プロジェクトのbin\Debug 配下におく。

調査結果

1) YamlDotNetのインストール

2) yamlファイルを開く
.NETのStreamReaderクラスでyamlファイルを読み込む。
Dim sr As New System.IO.StreamReader("test.yaml")
3) YamlDotNet.RepresentationModel.YamlStream クラス
上記クラスのオブジェクトを生成し、loadメソッドで2)のオブジェクトを渡す
Dim yaml As New YamlDotNet.RepresentationModel.YamlStream()
yaml.Load(sr)

4) 読み込んだ内容はyaml.Documents[0]に入るっぽい
Documentsの型:
System.Collections.Generic.IList(Of YamlDotNet.RepresentationModel.YamlDocument)

5) YamlDocumentの中身は?
YamlDocumentには "AllNodes" と "RootNode" の2つのプロパティがある。
中身を見たところ "RootNode" の方が使いやすいか?
となみに、それぞれの型は、
AllNodes - System.Collections.Generic.IEnumerable(Of YamlDotNet.RepresentationModel.YamlNode)
RootNode - YamlDotNet.RepresentationModel.YamlNode

6) 値の取得 1
RootNodeのChildrenプロパティで取得できそう。
Children - System.Collections.Generic.IDictionary(Of YamlDotNet.RepresentationModel.YamlNode, YamlDotNet.RepresentationModel.YamlNode)
このプロパティはディクショナリ型で、キー・値ともにYamlNode型である。
Childlenプロパティをクイックウォッチで見たところ:

ディクショナリの(0)にはYAML先頭の"name"、(1)には"items"が格納されている。

VBにてChildrenを取得しようとしたが、RootNodeプロパティのインテリセンスにChildrenが表示されない。
YamlMappingNodeでCastしないとダメ?のようだ。
DirectCast(yaml.Documents(0).RootNode, YamlMappingNode).Children

7) 値の取得 2
Childrenから、キー"name"の値を取得しようとして Children("name") なんてことはできない。
キーは "YamlNode" クラスで指定しないとダメなので。
ただ、YamlNodeクラスでなく YamlScalarNodeクラスを使うようである。(詳細は後で調査)
なので Children(new YamlScalarNode("name")) で値が取得できる。

取得したノードの値を取得するには?
正しい方法か不明だが・・・
DirectCast(Children.Item(new YamlScalarNode("name")), YamlScalarNode).Value

コレクションノードの場合は・・・
Dim Items As YamlSequenceNode = DirectCast(Children.Item(new YamlScalarNode("items")), YamlSequenceNode)
For Each Item As YamlMappingNode In Items
 :
Next
もっとスマートで正しい方法がありそうな気もするが。

YamlDotNet.Serialization.Deserializeクラスを使えばスマートで良さそうだが、
うまくいかない・・・
Googleで検索するとC#のサンプルソースはいくつか見つかったが、同じようにVBでやっても思った動作にならなかった。






次回記事:VisualBasic #8:YAML #2:読み込み方法


VisualBasic学習, YAML学習

0 件のコメント:

その他の記事