RSSを生成する

ちょっとRSSを生成したくて仕様を調べていたんだけど、バージョンが色々あってどれを使ったらいいのかさっぱりわからない。仕方がないので、はてなが配信しているRSSをテンプレートにすることにした。

最初はDOMでやろうかと思ったけど、面倒くさかったのでテンプレートエンジンを使った。テンプレートエンジンにはStringTemplateを使用。

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で生成したほうがいい場面ってあるのかな?