2013-02-18 88 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