VB.NET で XML(RSS)を読み込んで要素や属性を取得する

VB.NET で XML ファイルを読み込む練習として、Yahoo!ニュースの主なトピックスのRSSを読み込んでみます。
XmlReader で RSS を読み込み、タイトルとリンク先を取得します。
この記事は .NET Framework 2.0 以降が対象です。

[adsense1]

Yahoo!ニュースの主なトピックスの RSS に Google Chrome でアクセスすると以下のように表示されます。
※一部省略しています。
http://rss.dailynews.yahoo.co.jp/fc/rss.xml

<rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" version="2.0">
    <channel>
        <title>Yahoo!ニュース・トピックス - トップ</title>
        <link>http://dailynews.yahoo.co.jp/fc/</link>
        <description>Yahoo! JAPANのニュース・トピックスで取り上げている最新の見出しを提供しています。</description>
        <language>ja</language>
        <pubDate>Thu, 17 Jan 2013 15:11:17 +0900</pubDate>
        <item>
            <title>「PlayStation 4」今春発表か</title>
            <link>http://rd.yahoo.co.jp/rss/l/topics/topics/...</link>
            <pubDate>Thu, 17 Jan 2013 14:47:48 +0900</pubDate>
            <guid isPermaLink="false">yahoo/news/topics/6079832</guid>
        </item>
        <item>
            <title>次長課長河本 Twitterやめる</title>
            <link>http://rd.yahoo.co.jp/rss/l/topics/topics/...</link>
            <pubDate>Thu, 17 Jan 2013 12:13:12 +0900</pubDate>
            <guid isPermaLink="false">yahoo/news/topics/6079817</guid>
        </item>
    </channel>
</rss>

この RSS を XmlReader で読み込んで、タイトルとリンク先の部分を取得してみます。
XmlReader は DOM に比べて、処理速度は速いですが、あまり複雑なことは苦手であると思われます。

XmlReader と DOM の簡単な比較

アクセス順序
  XmlReader:文書の上から下に進むことしかできない
  DOM:アクセス順序に制限はなく、進んだり戻ったりできる

処理速度
  XmlReader:処理対象の部分だけをメモリに読み込むため処理速度が速い
  DOM:文書全体をメモリに読み込むため処理速度が遅い

XmlReader で RSS を読み込んで要素の値を取得する

XmlReader で Yahoo!ニュースの主なトピックスのRSS を読み込み、タイトルとリンク先を取得します。

Const YahooRSS As String = "http://rss.dailynews.yahoo.co.jp/fc/rss.xml"

Try
    Using xmlReader As System.Xml.XmlReader = System.Xml.XmlReader.Create(YahooRSS)
        xmlReader.ReadToFollowing("item")
        While xmlReader.Read
            If xmlReader.NodeType = System.Xml.XmlNodeType.Element Then
                Select Case xmlReader.LocalName
                    Case "title" : Console.WriteLine("タイトル:{0}", xmlReader.ReadString())
                    Case "link" : Console.WriteLine("リンク先:{0}", xmlReader.ReadString())
                End Select
            End If
        End While
    End Using
Catch ex As Exception
    Console.WriteLine(ex.Message)
End Try

Try-Catch-EndTry で、エラー処理を行なっています。
4行目で、XML を読み込むオブジェクトを作成しています。Using ステートメントを使用しているので xmlReader.close する必要はありません。
5行目の ReadToFollowing は、指定された要素が見つかるまで読み込みます。item 要素より上の要素は特に必要ないと判断して、item 要素がみつかるまでジャンプさせています。
6行目の While 文で、ノードが無くなるまで読み込みます。
While 文の中では、ノードの型が 要素(開始タグ)の場合に、要素の名前が[title]の場合と[link]の場合に、それぞれの要素の値を Console.WriteLine で、出力ウィンドウに表示しています。
出力ウィンドウが表示されていない場合は、[表示] → [その他のウィンドウ] → [出力] で表示してください。

なお、Yahoo!JAPAN が提供する RSS の一覧は、以下の URL で確認できます。
http://docs.my.yahoo.co.jp/st/promo_jp/rsslist.html

XmlReader ですべての要素名と要素の値を取得する

すべての要素名と要素の値を取得する場合は以下のようになります。

Using xmlReader As System.Xml.XmlReader = System.Xml.XmlReader.Create(YahooRSS)
    While xmlReader.Read
        If xmlReader.NodeType = System.Xml.XmlNodeType.Element Then
            ' 要素名=LocalName 要素の値=ReadString を表示
            Console.WriteLine("{0} = {1}", xmlReader.LocalName, xmlReader.ReadString())
        End If
    End While
End Using

XmlReader ですべての属性名と属性の値を取得する

すべての属性名と属性の値を取得する場合は以下のようになります。

Using xmlReader As System.Xml.XmlReader = System.Xml.XmlReader.Create(YahooRSS)
    While xmlReader.Read
        If xmlReader.NodeType = System.Xml.XmlNodeType.Element Then
            ' 属性がある場合
            If xmlReader.HasAttributes Then
                ' すべての属性を表示
                For i As Integer = 0 To xmlReader.AttributeCount - 1
                    ' 指定した属性に移動
                    xmlReader.MoveToAttribute(i)
                    ' 属性名=Name 属性の値=Value を表示
                    Console.WriteLine("{0} = {1}", xmlReader.Name, xmlReader.Value)
                Next i
                ' 現在の属性ノードを含む要素に移動
                xmlReader.MoveToElement()
            End If

            '↓属性名を指定する場合
            'If xmlReader.Name = "guid" Then
            '    Console.WriteLine(xmlReader.GetAttribute("isPermaLink"))
            'End If
        End If
    End While
End Using

XmlReader のプロパティの一覧や、メソッドの一覧は、以下のURLを参照してください。
XmlReader メンバ – MSDN ライブラリ
http://msdn.microsoft.com/ja-jp/library/system.xml.xmlreader_members(v=vs.80).aspx

NodeType の一覧は、以下のURLを参照してください。
XmlNodeType 列挙体 – MSDN ライブラリ
http://msdn.microsoft.com/ja-jp/library/system.xml.xmlnodetype(v=vs.80).aspx

[adsense2]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください