2012年12月23日日曜日

Visual Basic 特有の XML 記載で遊んでみる

これは Visual Basic Advent Calendar 2012 用の記事です。

Visual Basic 固有の機能の一つとして、XML の扱い方があります。扱い方、といっても処理方法が云々というわけではなく、定義としてそのまま記載できるですとか、処理を埋め込むことができるといったちょっt面白い記述が可能になりますので、今回はそのあたりを遊んでみました。


まず XML データを Visual Basic では直接定義することができます。

'サンプルデータ
Private xmlValue As XElement = <list>
<person twitter="@Masayuki_Ozawa" skill="お絵かき">ムッシュ</person>
<person twitter="@kamebuchi" skill="Azure">抱かれたい男No1</person>
<person skill="Sharepoint">シマえもん</person>
<person twitter="@mentaro" skill="XNA">社長</person>
</list>

また Import のもう一つの使い方として、XML データの名前空間を定義することもできます。

   1:  Imports <xmlns="http://kumaanija.jp/">

この xmlValue で定義したデータをそのまま Console.WriteLine すると次のようになります。

VB1

このように Imports で指定した名前空間が、XML データに適用されているのが見えると思います。しかし Visual Basic による XML 操作は他にも色々なことが可能です。

   1:  Console.WriteLine("Part 1:")
   2:  '普通に LINQ して抽出
   3:  Dim al1 = xmlValue.Elements().Where(Function(elm) elm.Attribute("twitter") IsNot Nothing)
   4:  Console.WriteLine("<ついったらー>")
   5:  For Each elm In al1
   6:      Console.WriteLine(elm.ToString)
   7:  Next
   8:  Console.WriteLine("</ついったらー>")

まずはそのままシンプルに LINQ to XML で抽出してみます。このあたりは別に Visual Basic だからということでもなく、他言語でもできるところです。実行結果は次の通りです。

VB2

次に埋め込み式と呼ばれる方法を用いて同じ事を行います。

   1:  '埋め込み式を利用
   2:  Dim al2 = <ついったらー>
   3:                <%= xmlValue.Elements.Where(Function(elm) elm.Attribute("twitter") IsNot Nothing) %>
   4:            </ついったらー>
   5:  Console.WriteLine(al2)

なんと先ほどの LINQ to XML で記載していた部分がまるまる埋め込むことができます。実行結果は次の通りです。

VB3

先ほどの結果と微妙に異なっているのがわかるでしょうか。Imports で指定した名前空間の適用がルートノードに対して行われているかどうかの違いがあります。サンプル1では直接出力していた部分は当然適用されていませんが、サンプル2では変数に値が設定されるタイミングで名前空間も適用されています。

さらに埋め込み式では自作のメソッドを呼び出すことも可能です。

   1:  '埋め込み式も利用して xml を変換
   2:  Dim cnvXml As New XElement("list")
   3:  For Each elm In xmlValue.Elements().Where(Function(el) el.Attribute("skill") <> "XNA")
   4:      Dim person = <person twitter=<%= ExtractTwitter(elm.Attribute("twitter")) %>>
   5:                       <%= ConvertElement(elm.Value) %>
   6:                   </person>
   7:      cnvXml.Add(person)
   8:  Next
   9:  Console.WriteLine(cnvXml)
  10:   
  11:  Private Function ExtractTwitter(value As String) As String
  12:      If value IsNot Nothing Then
  13:          Return value
  14:      Else
  15:          Return ""
  16:      End If
  17:  End Function
  18:   
  19:  Private Function ConvertElement(value As String) As String
  20:      Return value + "様"
  21:  End Function

属性 twitter の部分と、person エレメントの値の部分でそれぞれ自作メソッドを呼び出しています。これを実行すると次のようになります。

VB4

呼び出されたメソッドがちゃんと動作して、出力される結果が編集されているのが見えると思います。ここでさらに LINQ の記述を利用してまとめてしまうと、次のように書くこともできます。

   1:  'LINQ と埋め込み式を利用
   2:  Dim al4 = <list>
   3:                <%= xmlValue.Elements().Where(Function(el) el.Attribute("skill") <> "XNA") _
   4:                    .Select(Function(el)
   5:                                Dim res = el
   6:                                el.Value += "様"
   7:                                Return el
   8:                            End Function) %>
   9:            </list>
  10:  Console.WriteLine(al4)

LINQ の Select メソッドを利用して自作メソッドで行っていた文字列編集も盛り込んでみました。これを実行した結果が次のようになります。

VB5

このように Visual Basic では XML に関する記載や処理が、他言語と比べて面白く書くことができます。埋め込み式と LINQ を混ぜ合わせることで非常にシンプルに XML に対する処理を記述することができますので、色々と試してみると面白いのではないでしょうか。

0 件のコメント:

コメントを投稿