【開発】LinqでごりおしRSSを読み込む
いまさらながらLinq周辺をはじめてます。会社の環境が、VS2005なんだもん。
RSSの読み込みを、Linq/XElement辺りで色々いじってます。
匿名とかラムダ式とか、Linqって、なんかPerlみたいが印象。そう思った.NETやってるWeb技術者さんも多いんじゃないかな。
Perl同様、コードが、不可解な記号だらけになるので、C/Java寄りエンジニアさんは、顔をシカメるはずww
XMLとJavaScriptの親和性が気になって、今回のような追加仕様をしたんでしょうか。
んで、うろ覚えのLinqでRSS2.0を読む。もち、.Net標準のSyndicationFeedを使います。こちらは、RSS1.0は読めない。
Items = (from item in feed.Items let link = item.Links.FirstOrDefault() ?? new SyndicationLink(new Uri("about:blank")) let cat = (from ca in item.Categories select ca.Name).ToArray() let aut = (from au in item.Authors select au.Name).ToArray() let cont = (from itemext in item.ElementExtensions where itemext.OuterName == "encoded" && itemext.OuterNamespace == "http://purl.org/rss/1.0/modules/content/" select (itemext.GetObject())).ToArray() let cre = (from itemext in item.ElementExtensions where itemext.OuterName == "creator" && itemext.OuterNamespace == "http://purl.org/dc/elements/1.1/" select (itemext.GetObject ())).ToArray() select new RssItem { Title = item.Title.Text, Date = item.PublishDate.DateTime, Link = link.Uri, Description = item.Summary.Text, Category = string.Join(",",cat), // Auther = string.Join(",",aut), Auther = string.Join(",",cre), FeedID = item.Id, Content = string.Join(",",cont) }).ToArray()
抜粋ですけど、実際、SyndicationFeedを取得してすぐのところ。
通常あるtitle/link/date辺りは、プロパティでゲットできるんですが、creator/contentとか、XML名前空間が違うので、普通に取得できません(content:encodedやdc:creatorとか)
なので、ElementExtensionsに対して、さらにLinqで取得する必要があります。上の例でいう、letで取得してるところです。
賢いプログラマなら、RSS用の匿名メソッドとか埋め込んで、綺麗なコードにするんでしょうけどね。
しかし強力ですねLinq。いちいちSQL書いて、コード書いて・・とかこれまでの手順が馬鹿らしくなります。人件費気にするなら、VSを新しくせぇって。