摘要:[C#]讀取ATOM中的資料
剛剛遇到的問題,趕快來記一下.....
從Feed來源讀取到整個XML 大概是長這樣
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:app='http://purl.org/atom/app#' xmlns:media='http://search.yahoo.com/mrss/' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gd='http://schemas.google.com/g/2005' xmlns:yt='http://gdata.youtube.com/schemas/2007'>
.
.
.
.
<entry>
.
.
.
</entry>
</feed>
一開始沒想那麼多就開始用XPATH來截取XML資料
XmlNodeList list = doc.DocumentElement.SelectNodes("entry", nsm);
foreach (XmlNode item in list)
{
YoutubeEntity e = new YoutubeEntity();
e.Title = item.SelectSingleNode("title", nsm).InnerText;
e.Uri = item.SelectSingleNode("link[@rel='alternate']", nsm).Attributes["href"].Value;
e.Long = Convert.ToInt32(item.SelectSingleNode("./group/yt:duration", nsm).Attributes["seconds"].Value);
Collection.Add(e);
}
結果…杯具發生了…竟然抓不到任何一個XmlNode 以為是條件下錯,但試了又試就是抓不到........= =|||
這時靈光一閃,覺得此事並不單純,馬上拜了一下Google大神.....
後來得知原因在於XML有設定 XMLNameSpace 而造成沒辦法這樣使用,所以在載入XML後要來設定以下設定
XmlNamespaceManager nsm =
new XmlNamespaceManager(doc.NameTable);
nsm.AddNamespace("atom", "http://www.w3.org/2005/Atom");
nsm.AddNamespace("app", "http://purl.org/atom/app#");
nsm.AddNamespace("media", "http://search.yahoo.com/mrss/");
nsm.AddNamespace("openSearch", "http://a9.com/-/spec/opensearchrss/1.0/");
nsm.AddNamespace("gd", "http://schemas.google.com/g/2005");
nsm.AddNamespace("yt", "http://gdata.youtube.com/schemas/2007");
所有在上頭定義的NameSpace都要設定,才能確保找得到資料。再來改寫剛剛的程式
XmlNodeList list = doc.DocumentElement.SelectNodes("atom:entry", nsm);
foreach (XmlNode item in list)
{
YoutubeEntity e = new YoutubeEntity();
e.Title = item.SelectSingleNode("atom:title", nsm).InnerText;
e.Uri = item.SelectSingleNode("atom:link[@rel='alternate']", nsm).Attributes["href"].Value;
e.Long = Convert.ToInt32(item.SelectSingleNode("./media:group/yt:duration", nsm).Attributes["seconds"].Value);
Collection.Add(e);
}
這樣果然抓到指定的資料~GG