LINQ to XML を使ってみた(VB.NET)

またまた備忘録です。WebRequest で XML 取得しごりごりデシリアライズしてたのを、LINQ to XML で書き直してみました。感想・・・凄くすっきりしたコードになりますね!

元コード。WebRequest を使ってXMLを取得、XmlTextReader に読み込んで、ごりごりデシリアライズしてます。

Imports System.Collections.Generic
Imports System.Xml
Imports System.Xml.Serialization

Public Class Holiday
    <XmlElement("date", GetType(Date))>
    Property Day As Date
    <XmlElement("name", GetType(String))>
    Property Name As String
End Class

Public Class Holidays
    Public Shared Function GetHoliday() As List(Of holiday)
        DIm holidayList As New List(Of holiday)
        Dim webreq = System.Net.WebRequest.Create(New Uri(searchHolidayUrl))
        Using webres = webreq.GetResponse(), st = webres.GetResponseStream()
            Dim reader As New XmlTextReader(st)
            Dim serializer As New System.Xml.Serialization.XmlSerializer(
                GetType(Holiday),
                New System.Xml.Serialization.XmlRootAttribute("holiday")
            )
            While (reader.Read())
                If (reader.Name = "holiday") Then
                    Dim result = CType(serializer.Deserialize(reader), Holiday)
                    If (result IsNot Nothing) Then
                        holidayList.Add(result)
                    End If
                End If
            End While
        End Using
        Return holidayList
    End Function
End Class


LINQ to XML 使ったらこうなった。えらいすっきりしましたね。こりゃLINQ星人増えるの無理ないわw

Imports System.Xml.Linq

Public Class Holiday
    Property Day As Date
    Property Name As String
End Class

Public Class Holidays
    Public Shared Function GetHoliday() As IEnumerable(Of Holiday)
        Dim element = XElement.Load(searchHolidayUrl)
        Dim holidays = From e In element.Elements
            Select New Holiday() With {
                .Day = CDate(e.Element("date").Value),
                .Name = e.Element("name").Value
        }
        Return holidays
    End Function
End Class