Google Calendarで日本の祝日を取得

前にちょこっと書いたものの実装編

struct Holiday {
	public DateTime Date;
	public string Title;

	public override string ToString() {
		return Title + ":" + Date.ToString("yyyy/MM/dd");
	}
}

class Calender {
	private const string requestUrl
		= "http://www.google.com/calendar/feeds/ja.japanese%23holiday%40group.v.calendar.google.com/public/full-noattendees"
			+ "?start-min={0}&start-max={1}&max-results={2}";

	static string DateToString( DateTime date ) {
		return date.ToString( "yyyy-MM-dd" );
	}

	static public List<Holiday> GetHolidays() {
		return GetHolidays( DateTime.Now, DateTime.Now.AddYears( 1 ), 100 );
	}

	static public List<Holiday> GetHolidays( DateTime start, DateTime maxDate, int maxResult ) {
		var request = (HttpWebRequest)WebRequest.Create(
			string.Format( requestUrl, DateToString( start ), DateToString( maxDate ), maxResult )
		);
		var response = (HttpWebResponse)request.GetResponse();

		XmlDocument document = new XmlDocument();
		document.Load( response.GetResponseStream() );
		var list = document.GetElementsByTagName("entry");

		List<Holiday> holidays =new List<Holiday>();
		foreach (XmlNode childNode in list) {
			holidays.Add( GetHoliday( childNode ) );
		}
		return holidays;
	}

	private static Holiday GetHoliday( XmlNode node ) {
		Holiday holiday=new Holiday();
		foreach ( XmlNode childNode in node ) {
			if ( childNode.Name == "title" ) {
				holiday.Title = childNode.InnerText;
			}
			if ( childNode.Name == "gd:when" ) {
				holiday.Date = DateTime.Parse( childNode.Attributes.GetNamedItem( "startTime" ).Value );
			}
		}
		return holiday;
	}
}

Main

static void Main( string[] args ) {
	foreach (var holiday in Calender.GetHolidays() ) {
		Console.WriteLine( holiday );
	}
}