いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Visual Basic固有のXMLデータの扱い方 (System.Xml, VB, リテラル)


VBすげーって思った今日この頃。


以下のMSDNバーチャルラボにて知りました。


.NET Framework 3.5になって、XMLを処理するクラスに以下のクラスが追加されています。

  • XDocument
  • XElement
  • XAttribute


上記のやつでも十分便利なのですが、VBの場合はさらに固有のやり方があります。
まずは以下のソースを見てみてください。

Imports System
Imports System.Collections.Generic
Imports System.Data
Imports System.Linq
Imports System.Xml
Imports System.Xml.Linq
Imports System.Xml.XPath

Public Class Program

    Public Sub Execute()
        '
        ' XDocumentオブジェクトのコンストラクタで一気に生成. (C#でも利用可能)
        '
        Dim xmlDoc = CreateXDocument()
        Console.WriteLine(xmlDoc)

        Console.WriteLine()

        '
        ' リテラルからXDocumentを生成. (VB特有)
        '
        xmlDoc = CreateXDocument2()
        Console.WriteLine(xmlDoc)

        Console.WriteLine()

        '
        ' <%= %>を利用してXDocumentを生成. (VB固有)
        '
        xmlDoc = CreateXDocument3()
        Console.WriteLine(xmlDoc)

        '
        ' 通常の要素へのアクセス方法.
        '
        Console.WriteLine(xmlDoc.Element("TestData").Element("Data").Element("answer").Value)

        Dim elements = _
                From element In xmlDoc.Descendants("answer") _
                Select element

        For Each element In elements
            Console.WriteLine(element.Value)
        Next

        '
        ' VB特有のアクセスの方法.
        '
        Console.WriteLine(xmlDoc....Value)

        elements = _
            From element In xmlDoc... _
            Select element

        For Each element In elements
            Console.WriteLine(element.Value)
        Next

    End Sub

    Private Function CreateXDocument() As XDocument

        Return New XDocument( _
                        New XElement("TestData", _
                                New XElement("Data", _
                                         New XElement("x", 1), _
                                         New XElement("y", 2), _
                                         New XElement("answer", 3) _
                                ), _
                                New XElement("Data", _
                                         New XElement("x", 2), _
                                         New XElement("y", 3), _
                                         New XElement("answer", 5) _
                                ) _
                        ) _
                )

    End Function

    Private Function CreateXDocument2() As XDocument

        Dim contents As XElement = _
                
                    
                        1
                        2
                        3
                    
                    
                        2
                        3
                        5
                    
                

        Return New XDocument(contents)
    End Function

    Private Function CreateXDocument3() As XDocument

        Dim contents As XElement = _
                
                    <%= From i In Enumerable.Range(1, 2) _
                        Let x = i _
                        Let y = (i + 1) _
                        Let answer = (x + y) _
                        Select _
                        
                            <%= x %>
                            <%= y %>
                            <%= answer %>
                         _
                    %>
                

        Return New XDocument(contents)

    End Function

    Shared Sub Main()
        Dim prg = New Program()
        prg.Execute()

        Console.ReadKey()
    End Sub
End Class


VBの場合は、以下のやり方が出来ます。

  • XMLをリテラルで書くと、XElementオブジェクトに変換してくれる。
        Dim contents As XElement = _
                
                    
                        1
                        2
                        3
                    
                    
                        2
                        3
                        5
                    
                

って書いてもオッケイです。(コンパイルがちゃんと通ります。)


さらに、ASP.NETライクな記法も使えます。

        Dim contents As XElement = _
                
                    <%= From i In Enumerable.Range(1, 2) _
                        Let x = i _
                        Let y = (i + 1) _
                        Let answer = (x + y) _
                        Select _
                        
                            <%= x %>
                            <%= y %>
                            <%= answer %>
                         _
                    %>
                

って書いてもオッケイです。(コンパイルがちゃんと通ります。)


要素にアクセスする際も、以下のようにしてアクセスできます。

  • Descendantsメソッドと同じ効果
xmlDoc...
  • Elementメソッドと同じ効果
xmlDoc...


上記のバーチャルラボでは、他にもXMLの更新方法のやり方などが
分かりやすく載っていますので勉強になります。