【開発】LinqでごりおしRSSを読み込む

プライベート

images

いまさらながら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を新しくせぇって。

プライベート

Posted by nabe