【開発】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を新しくせぇって。






















ディスカッション
コメント一覧
まだ、コメントがありません