環境
Visual Studio 2015 Community 2015
- Version 14.0.25431.01 Update 3
使用するフレームワークは .NET Framework 4.5.2
- 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ファイルを開く
4) 読み込んだ内容はyaml.Documents[0]に入るっぽい
5) YamlDocumentの中身は?
6) 値の取得 1
7) 値の取得 2
2) yamlファイルを開く
.NETのStreamReaderクラスでyamlファイルを読み込む。
3) YamlDotNet.RepresentationModel.YamlStream クラスDim sr As New System.IO.StreamReader("test.yaml")
上記クラスのオブジェクトを生成し、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)
System.Collections.Generic.IList(Of YamlDotNet.RepresentationModel.YamlDocument)
5) YamlDocumentの中身は?
YamlDocumentには "AllNodes" と "RootNode" の2つのプロパティがある。
中身を見たところ "RootNode" の方が使いやすいか?
となみに、それぞれの型は、
中身を見たところ "RootNode" の方が使いやすいか?
となみに、それぞれの型は、
AllNodes - System.Collections.Generic.IEnumerable(Of YamlDotNet.RepresentationModel.YamlNode)
RootNode - YamlDotNet.RepresentationModel.YamlNode
RootNode - YamlDotNet.RepresentationModel.YamlNode
6) 値の取得 1
RootNodeのChildrenプロパティで取得できそう。
Childlenプロパティをクイックウォッチで見たところ:
ディクショナリの(0)にはYAML先頭の"name"、(1)には"items"が格納されている。
VBにてChildrenを取得しようとしたが、RootNodeプロパティのインテリセンスにChildrenが表示されない。
YamlMappingNodeでCastしないとダメ?のようだ。
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")) で値が取得できる。
取得したノードの値を取得するには?
正しい方法か不明だが・・・
コレクションノードの場合は・・・
もっとスマートで正しい方法がありそうな気もするが。キーは "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でやっても思った動作にならなかった。
うまくいかない・・・
Googleで検索するとC#のサンプルソースはいくつか見つかったが、同じようにVBでやっても思った動作にならなかった。
0 件のコメント:
コメントを投稿