XMLからDOMを構築して、Xpathで読むのはMasayoshi’s Blog – C# Express を使ってみよう : XML DOM超入門が詳しい。参考になった。

もうちょっといじって、このblogのindex.xml(rss2.0)を読む簡単なRSSリーダーを作ってみた。

RssReader

コンソールだけど。

XMLを直接DOMのまま扱うのはちょっと面倒臭いので、まずDOMを普通のオブジェクトに読み込む。

RSSアイテム1つ(エントリ1つの事)を格納するクラスを用意しておく

classRssItem

{

publicstringtitle,description,link,guid,category,pubDate;

}

このRssItemをArrayListに詰め込んで管理する。



使うのはSystem.Xml.XmlDocument, XmlNodeList, XmlNode

XmlNode.InnerTextは .Valueでもいいけど、中身がXMLの場合Valueは何も返してくれないのでInnerTextで。

中にXMLノードがさらにあるかどうかは XmlNode.HasChildNodesで確認できる。

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.Xml;

usingSystem.Collections;

namespaceReadXmlTest

{

///



///DOMをオブジェクトの配列にしてから処理する

///


classProgram

{

staticvoidMain(string[]args)

{

Console.WriteLine(“—start—“);

stringurl=”http://web.sfc.keio.ac.jp/~shokai/index.xml”;

XmlDocumentxml=newXmlDocument();

Console.WriteLine(“loadingxml:”+url);

xml.Load(url);//XML読み込み

stringxpath=”/rss/channel/item”;//

Console.WriteLine(“xpath:”+xpath);

ArrayListrssItems=newArrayList();//RSSのアイテムリスト

XmlNodeListnodeList=xml.SelectNodes(xpath);//XpathでDOMを辿る

foreach(XmlNodenodeinnodeList)

{

RssItemrssItem=newRssItem();//RSSアイテムを1つ格納するオブジェクト

foreach(XmlNodeterminal_nodeinnode)

{

//RSSのアイテムをオブジェクトに格納する

switch(terminal_node.Name)

{

case”title”:

rssItem.title=terminal_node.InnerText;

break;

case”description”:

rssItem.description=terminal_node.InnerText;

break;

case”link”:

rssItem.link=terminal_node.InnerText;

break;

case”guid”:

rssItem.guid=terminal_node.InnerText;

break;

case”category”:

rssItem.category=terminal_node.InnerText;

break;

case”pubDate”:

rssItem.pubDate=terminal_node.InnerText;

break;

}

}

rssItems.Add(rssItem);

}

Console.WriteLine(rssItems.Count+”個のRSSItem取得”);

foreach(RssItemiinrssItems)//RSSアイテムの中身1つずつ取り出してみる

{

Console.WriteLine(“***”);

Console.WriteLine(i.title);

Console.WriteLine(i.link);

Console.WriteLine(i.pubDate);

}

Console.WriteLine(“—endofresult—¥r¥n¥r¥n”);

Console.ReadLine();//コンソールがすぐ消えない様に、入力待ち

}

}

}