何が悲しくて 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データが練習用にちょうどいい。
使うのは、Microsoft の Visual Studio 2019。最新版の2022じゃないのですけど、昨年、Visual Studioを使って、C++あたりでプログラムを書いてみようかとインストールしたままになっていたものをそのまま使いました。
以下は、プロジェクトの選択画面。
Console版アプリを使うことにしました。
モダンな開発環境って便利ですね。最小のスケルトンが埋め込まれて起動するので、直接プログラムロジックを書くことができます。
とはいえ、Basicで Hello World にはちょっと違和感が。この一行を消して、プログラム開始。
試行錯誤して、Xml.GetElementsByTagName を使うのが、私の目標に近そうだとわかりました。
結果として、以下のように書けば、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