2010-12-30 10 views
2

今日はどうですか?C#XML解析 - 一部の「アイテム」のヌルタグをスキップ

私はこのコードを使用して、XMLファイルを読み込み、後で各ループの結果をmyに配置します。

var document = XDocument.Load(e.Result); 
if (document.Root == null) 
      return; 

     var georss = XNamespace.Get("http://www.georss.org/georss"); 

var events1 = from ev1 in document.Descendants("channel").Elements("item") 

         let values = ev1.Element(georss + "point").Value.Split(' ') 
         select new  
         { 
         Latitude = double.Parse(values[0], CultureInfo.InvariantCulture), 
         Longitude = double.Parse(values[1], CultureInfo.InvariantCulture), 
         Title = (ev1.Element("title").Value), 
               }; 


      blahblahMethod(); 

     foreach (var ev1 in events1) 
     { 
     blah blah do stuff 
     } 

は[OK]を、私たちがしているので、そこに、私は、XMLファイル内の各親「の項目」タグ内にネストされている「点」と「タイトル」タグの内容をつかみます。 XMLファイルには10個の項目があります。問題は、「項目」のすべてに「ポイント」タグが含まれているわけではないことです。それはいくつかの項目から完全に欠けている。そのため、「タイトル」タグだけがあります。

XMLリーダーがこれらの項目のいずれかに到達すると、 'NullReferenceException was unhandled'がスローされます。それで、かなり明白な何が起こっている。私はこれを回避する方法に問題があります。私はいくつかの 'if'文を考えました。もしそれがヌルタグになると、それはスキップされますが、VSは受け入れて何のエラーも投げない何かに合っているようです。どんな助けもありがたい。

答えて

2

(!ここでは初心者には、してください:-)優しくして)私は、クエリ言語の構文については、嫌悪を持っていると私はこのようなラインからあなたを微調整することになるので、直接拡張メソッドを使用することを好む: -

from ev1 in document.Descendants("channel").Elements("item") 
    .Where(e => e.Element(georss + "point") != null) 

同じ事をするためにfromの直後にクエリーにwhere句を追加することもできます。

+0

もう一度ブラミストライク...アンソニーありがとう、それはそれをクラックした。私は "e"を "ev1"に変更しなければならなかった、それは間違いだったと思う?そうでなければ何か新しいことを学んだ;-)私は決して実際にWhereステートメントを使用したことがないので、私の心を越えたことはありません。コーディングのレッスンにもう一度感謝します! –

+0

実際にもう1つ、ここで何が起こっているのか理解できるように助けてくれますか?それはgeorss + pointタグを使ってアイテムをフィルタリングするように見えますが、明らかに反対です! :-D –

+0

@Dan:あなたはev1を使用していますが、eは既にスコープにあります(コードはeventargsパラメータとしてeを使用しているイベントハンドラにあります)ので、eを使用するのは間違いでした。私は使用することができます: - pinkElephants => pinkElephants.Element(...)それは働いていたでしょう。 – AnthonyWJones