2012-01-16 12 views
1

XElement から子孫要素を削除しようとしていましたが(.Remove()を使用)を使用していて、nullのオブジェクト参照を取得しているようですが、その理由はわかりません。属性値に基づいてXMLから要素を削除しますか?

がこのタイトルsee hereで前の質問を見たので、私はそれを削除する方法を見つけましたが、私は第一を試した方法が機能しなかった理由を私はまだ表示されません。

誰かが私を啓発できますか?

String xml = "<things>" 
      + "<type t='a'>" 
      + "<thing id='100'/>" 
      + "<thing id='200'/>" 
      + "<thing id='300'/>" 
      + "</type>" 
      + "</things>"; 

    XElement bob = XElement.Parse(xml); 

    // this doesn't work... 
    var qry = from element in bob.Descendants() 
      where element.Attribute("id").Value == "200" 
      select element; 
    if (qry.Count() > 0) 
    qry.First().Remove(); 

    // ...but this does 
    bob.XPathSelectElement("//thing[@id = '200']").Remove(); 

おかげで、 ロス

答えて

2

問題は、あなたが反復されているコレクションはid属性を持っていないいくつかの要素が含まれていることです。それらの場合、element.Attribute("id")nullなので、ValueプロパティにアクセスしようとするとNullReferenceExceptionがスローされます。

var qry = from element in bob.Descendants() 
      where (string)element.Attribute("id") == "200" 
      select element; 

要素がid属性、ここでは正常に動作キャスト意志戻りnullを、持っていない場合:これを解決する

一つの方法ではなくValuea castを使用することです。

キャストしている場合は、必要に応じてint?にキャストすることもできます。

+0

ありがとうございました。私は今問題が何かを見ています。 –

1

は、以下のことを試してみてください。

var qry = bob.Descendants() 
       .Where(el => el .Attribute("id") != null) 
       .Where(el => el .Attribute("id").Value = "200") 

    if (qry.Count() > 0) 
    qry.First().Remove(); 

あなたは、その値を取得する前にid属性の存在をテストする必要があります。

+0

有用なアドバイスをありがとう。属性をチェックする - 私はなぜsvickの答えの観点から関連性が高いかを知る。 –

+0

@BlackLightああ、それは試してみる価値があった! – ColinE

+0

犯行はありませんが、3年以上経過しており、私はこのコードでどのような誤りも見られなかったことに本当に驚いています。 3つの非常に目立つ間違いがあります。 'El.Attribute'に空白があり、' Attribute( "id")。Value = "200" 'は属性(" id ")でなければなりません。二重=記号に注意してください。 –

関連する問題