[C#]讀取ATOM中的資料

摘要:[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

參考來源