0

この URL から Google カレンダーのイベントを解析しようとしています: http://www.google.com/calendar/feeds/amchamlva%40gmail.com/public/full で、ここに私のコードがあります:

 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,

おそらく値がnullであるため、例外が発生しました。実際には、valueString属性値を取得する必要があります(この場合は「どこか」など)

<gd:where valueString='Somewhere'/>
4

3 に答える 3

2

助けてくれてありがとう、次の簡単なコードで動作します:

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

後で、より良いコード実装のためにあなたの提案を実装しようとします;)

于 2013-02-18T14:11:26.107 に答える
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")
       };

(これは、いくつかのドキュメントに基づいて名前空間について知識に基づいた推測を行っています。ただし、実際のフィードに対してこれを確認する必要があります。)

于 2013-02-18T13:59:35.970 に答える