VB.NET: XMLファイル内の要素を表示する方法

何が悲しくて Visual Basic に手を出さなきゃいけなくなったのかは置いておくとして、なんらかのプログラムからXMLファイルに含まれるデータの値を知らなきゃいけなくなりました。

以前、Powershell を使って、ノートパソコンのバッテリー情報へアクセスする方法を調べたことがあります。今回もPowershellを使いたかったのですが、残念ながらVisual Basic、正確にはVB.NETを使うことになりました。Powershellの時は、結構簡単に情報が見つかって、あまり苦労しなかった印象なんですが、VB.NETは情報にたどり着くのにとっても苦労しました。一つは、私がVisual Basic にほとんど触ったことがなかったためですが、Powershell風の文法かと思っていたら、とっくに忘れていたDIM文とか、オブジェクト指向の命令とかがあって、思い出したり、構造を理解するのに苦労して、本来の目的であるXML処理に到達するまで一週間近くかかってしまいました。むか~し、8bit PCを使っていた時代、月刊のPC雑誌を買って、プログラムをタイプしていた頃に比べ、今はYoutubeにアップされているトレーニング動画を眺めて、Webでサンプルコードを探してと、勉強の流れが全然違ってますが、言語の全体構造を理解するのにYoutubeってとっても便利。

さて、XMLのサンプルとしては、ラジコの放送局情報を使うことにしました。以下。<station> ~ </station> が一つの放送局情報ブロックになっていて、<id> とか <name> タグなど一つのブロック中一つしか使われていないタグと、 <logo> タグのように複数含まれているものが混在しています。

ラジコの放送局情報XML形式

こういうXMLデータが練習用にちょうどいい。

使うのは、Microsoft の Visual Studio 2019。最新版の2022じゃないのですけど、昨年、Visual Studioを使って、C++あたりでプログラムを書いてみようかとインストールしたままになっていたものをそのまま使いました。

以下は、プロジェクトの選択画面。
Console版アプリを使うことにしました。

Visual Studio プロジェクト選択画面モダンな開発環境って便利ですね。最小のスケルトンが埋め込まれて起動するので、直接プログラムロジックを書くことができます。
とはいえ、Basicで Hello World にはちょっと違和感が。この一行を消して、プログラム開始。

Visual Basic初期画面

試行錯誤して、Xml.GetElementsByTagName を使うのが、私の目標に近そうだとわかりました。

結果として、以下のように書けば、XML内のデータを自由に表示できることがわかりました。ここまで遠かった~。

ラジコの放送局情報にプログラムからアクセスする

プログラムを実行すると、以下のように都道府県コード、放送局コード、放送局名 を表示することができました。

XML内の要素を、一覧表示

この出力結果は、XMLファイル内の、<area_id>, <id>, <name> タグ情報を表示しています。
Write.Line() で表示しているため、端末画面に垂れ流すだけですが、ここまでできれば、あとは、変数に取り込むとか、ファイルに書き出すとか自由にできます。まだ、取り出したデータの扱いに関してはプログラムに反映させていませんけど、Imports System.Xml でライブラリを取り込んだあと、どんな命令を使って個別データにアクセスすればいいかがわかりましたので、いったんメモに残しておくことにしました。
XMLを取り扱う命令はたくさんあるようで、この書き方が最適なのかどうかはわかりません。
他にもアクセス方法はあるようです。

上記のプログラム画像のソースコードは以下。

Imports System.Xml

Module Program
    Sub Main(args As String())
        'ラジコの放送局情報をXMLサンプルとして使用します。
        Dim radiko_stations As String = "http://radiko.jp/v3/station/region/full.xml"
        'プログラムの実行フォルダーをワークフォルダーとしても利用するため場所をセット
        Dim prog_dir As String = Environment.CurrentDirectory
        'リモートサーバーファイルをダウンロードする準備
        Dim wc As New System.Net.WebClient()
        'ダウンロードするXMLファイルを利用する準備
        Dim xmlStation As New XmlDocument()
        '保存するファイル名を指定してリモートファイルをダウンロード
        wc.DownloadFile(radiko_stations, prog_dir + "\station.xml")
        'ダウンロードしたXMLファイルを変数に取り込む
        xmlStation.Load(prog_dir + "\station.xml")
        'XMLファイルの一つのブロックに一つ含まれる要素 id を取り込む
        Dim id As XmlNodeList = xmlStation.GetElementsByTagName("id")
        '要素 id の数を数えて、XMLファイルに含まれるブロック数をカウントする
        Dim node_count As XmlNodeList = id
        'その他、XMLファイルから取り出したい要素を指定する、以下2行
        Dim name As XmlNodeList = xmlStation.GetElementsByTagName("name")
        Dim area_id As XmlNodeList = xmlStation.GetElementsByTagName("area_id")
        '含まれているブロック数分の要素を取り出す
        For i As Integer = 0 To (node_count.Count) - 1
            Console.WriteLine(area_id(i).InnerText + ":" + id(i).InnerText + "," + name(i).InnerText)
        Next
    End Sub
End Module

 

コメントを残す