2013-02-18 83 views
0

我想從這個URL解析谷歌日曆事件:http://www.google.com/calendar/feeds/amchamlva%40gmail.com/public/full 這裏是我的代碼:解析XML谷歌日曆事件

static IEnumerable<Event> getEntryQuery(XDocument xdoc) 
    { 
     return from entry in xdoc.Root.Elements().Where(i => i.Name.LocalName == "entry") 
       select new Event 
       { 
        EventId = entry.Elements().First(i => i.Name.LocalName == "id").Value, 
        Published = DateTime.Parse(entry.Elements().First(i => i.Name.LocalName == "published").Value), 
        Title = entry.Elements().First(i => i.Name.LocalName == "title").Value, 
        Content = entry.Elements().First(i => i.Name.LocalName == "content").Value, 
        Where = entry.Elements().First(i => i.Name.LocalName == "gd:where").FirstAttribute.Value, 
        Link = entry.Elements().First(i => i.Name.LocalName == "link").Attribute("href").Value, 

       }; 
    } 

using (StreamReader httpwebStreamReader = new StreamReader(e.Result)) 
      { 
       var results = httpwebStreamReader.ReadToEnd(); 

       XDocument doc = XDocument.Parse(results); 

       System.Diagnostics.Debug.WriteLine(doc); 

       var myFeed = getEntryQuery(doc); 
       foreach (var feed in myFeed) 
       { 
        System.Diagnostics.Debug.WriteLine(feed.Content); 

       } 

      } 

和它的工作原理差不多很好,除了這一點:

Where = entry.Elements().First(i => i.Name.LocalName == "gd:where").FirstAttribute.Value, 

我有一個例外可能是因爲價值是零,其實我需要得到(在這種情況下,例如「某處」)的valueString attribue值

<gd:where valueString='Somewhere'/> 

回答

2

本地<gd:where>的名稱只是where - gd部分是命名空間別名。

而不是使用所有這些First調用檢查本地名稱,這將是清潔劑,如果你只是使用正確的完全合格的名稱。例如:

XNamespace gd = "http://schemas.google.com/g/2005"; 
XNamespace atom = "http://www.w3.org/2005/Atom"; 

return from entry in xdoc.Root.Elements(gd + "entry") 
     select new Event 
     { 
      EventId = (string) entry.Element(atom + "id"), 
      Published = (DateTime) entry.Element(atom + "published"), 
      Title = (string) entry.Element(atom + "title"), 
      Content = (string) entry.Element(atom + "content"), 
      Where = (string) entry.Element(gd + "where") 
      Link = (string) entry.Element(atom + "link") 
     }; 

(。這是基於一些documentation命名空間進行猜測你應該儘管檢查這對您的實際飼料)

2

感謝您的幫助傢伙,它的工作原理與此簡單的代碼:

//Where = entry.Elements().First(i => i.Name.LocalName == "where").Value, 
    Where = entry.Elements().First(i => i.Name.LocalName == "where").Attribute("valueString").Value, 

後,我會盡力實現一個更好的代碼實現您的建議;)

+0

良好的工作!這是我需要的! :) – JackTurky 2013-02-25 23:46:19