2013-02-18 2 views
0

Я пытаюсь разобрать Google календарные события из этого URL: http://www.google.com/calendar/feeds/amchamlva%40gmail.com/public/full и вот мой код:синтаксического анализа XML календарь Google событие

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 Attribué значение (например, «Где-то» в данном случае)

<gd:where valueString='Somewhere'/> 
выглядит

ответ

2

местный имя <gd:where> всего лишь where - the 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