2017-12-26 70 views
1

特定の属性を持つ要素が存在するかどうかを解析するxml文書があります。XMLからLinq要素へ属性から選択するときにオブジェクト参照エラーが発生する

私は

item.Descendants().Elements("nameValue"); 

を行うと、私は結果の束を見ることができると私はドリルダウンしたときに、私も属性

だが、私はこのようになりますNAMEVALUEノードがあるとしましょう見ることができます。

<nameValue idref="myIDRef" name="elementName"/> 

この要素をidrefで見つけ出すのに2つの方法を試しましたが、どちらもオブジェクト参照エラーを返します。私は、これは非常に簡単であると確信しているが、私は、私は本当に

item.Descendants().Select(a => a.Element("nameValue")).Where(b => b.Attribute("idref").Value == "myIDRef"); 
item.Descendants().Elements("nameValue").Single(a => a.Attribute("idref").Value == "myIDRef"); 

上記の作業のどちら

EDITをこだわっていることをあまりにも長い間、この見つめてきた:私は、私は考え出したと思いますなぜそれが働いているのか。私のnameValue要素のコレクションには何百もの項目がありますが、そのすべてが "idref"属性を持っているわけではありません。そのため、特定の属性がコレクションに存在していてもオブジェクト参照エラーが発生します。

はこれに対する私のソリューションは、あなたが使用できるのLINQを使用してXPathSelectElements代わり

var nameValueArr = element.XPathSelectElements("descendant::nameValue[@idref='myIDRef']"); 
+0

2つ目は何が問題なのですか?それは私のために働く – Magnetron

+0

私は考えていない、私は二重と三重を綴りとすべてをチェックしました。それだけでは機能しません。 これは動作しました: var nameValueTest = element.XPathSelectElement( "descendant :: nameValue [@ idref = 'myIDRef']"); – JOO

+0

値を使用すると、見つからない場合があります。 b.Attribute( "idref")ValueTo "(文字列)b.Attribute(" idref ") – jdweng

答えて

0

を使用しないことでした

var el = item.Descendants("nameValue") 
    .FirstOrDefault(x=>x.Attribute("idref")?.Value=="myIDRef"); 
複数の要素がある場合にシングルFirstOrDefaultリターンながら、エラーが返されます

最初の要素、または要素がない場合はnull

あなたの編集を読んだら、上のコードのように、Valueの前にnull-condicional演算子(?.)を使うことができます。 「idref」属性がない場合はnullを返し、そうでない場合はValueを評価します。

1

私はあなたがまだあなたが期待している結果を得るためにXMLにLINQを使用することができ、今すぐアップデートを見た:

var result= item.Descendants("nameValue") 
       .Where(e=>(string)e.Attribute("idref")=="myIDRef"); 

キャストは、あなたがエラーの保存されている、属性が欠落している場合nullを返し、そうします要素に属性がない場合はnull"myIDRef"を比較するので、

+0

ありがとうございました!それは多くの意味があり、文字列にキャストすることは考えられませんでした。 – JOO

関連する問題