RSSを生成する
ちょっとRSSを生成したくて仕様を調べていたんだけど、バージョンが色々あってどれを使ったらいいのかさっぱりわからない。仕方がないので、はてなが配信しているRSSをテンプレートにすることにした。
最初はDOMでやろうかと思ったけど、面倒くさかったのでテンプレートエンジンを使った。テンプレートエンジンにはStringTemplateを使用。
まずは以下のクラスを作る。
RssItem.cs
class RssItem { public string Title { get; set; } public string Url { get; set; } public string Description { get; set; } }
で、RSSのテンプレートファイル
rss.st
<?xml version="1.0" encoding="utf-8"?> <rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="ja"> <channel rdf:about="$link$"> <title>$title$</title> <link>$link$</link> <description></description> <dc:creator></dc:creator> <dc:date></dc:date> <items> <rdf:Seq> $items:{item| <rdf:li rdf:resource="$item.Url$" />}$ </rdf:Seq> </items> </channel> $items:{item| <item rdf:about="$item.Url$"> <title>$item.Title$</title> <link>$item.Url$</link> <description>$item.Description$</description> <dc:creator></dc:creator> <dc:date></dc:date> <dc:subject></dc:subject> </item>}$ </rdf:RDF>
テンプレートにデータを流し込むコード。
Program.cs
static void Main() { var items = new [] { new RssItem() { Title="Hoge", Url="http://d.hatena.ne.jp/coma2n", Description="ほげ" } }; using(var sr = new StreamReader("\rss.st")) { var template = new StringTemplate(sr.ReadToEnd()); template.SetAttribute("title", "はてなダイアリー"); template.SetAttribute("link", "http://d.hatena.ne.jp"); template.SetAttribute("items", items); using(var sw = new StreamWriter("rss.xml", false, Encoding.UTF8)) { sw.Write(template.ToString()); } } }
これでさくっと作れた。DOMでやるよりもはるかに実行効率もいいだろうし、見通しもいい。名前空間を多用したXMLを生成するのもDOMでは面倒くさいので、こっちのほうが遥かにいい。
というか、DOMで生成したほうがいい場面ってあるのかな?