2016-05-01 17 views
0

XML属性の基準を使用して要素の値を取得しようとしています。本質的には、ドキュメント全体から1つの値が必要なので、直接クエリを実行しようとしています。これは私のXMLファイルです:C# - その属性でxml要素の値を取得

<?xml version="1.0" encoding="UTF-8"?> 
<list version="1.0"> 
    <meta> 
     <type>resource-list</type> 
    </meta> 
    <resources start="0" count="1"> 
     <resource classname="Quote"> 
     <field name="name">Microsoft Corporation</field> <!-- I want this!!! --> 
     <field name="price">49.869999</field> 
     <field name="symbol">MSFT</field> 
     <field name="ts">1461960000</field> 
     <field name="type">equity</field> 
     <field name="utctime">2016-04-29T20:00:00+0000</field> 
     <field name="volume">48411684</field> 
     </resource> 
    </resources> 
</list> 

特に、「name」属性を持つフィールドが必要です。これは私がこれを検索するために行ったことです:

  XDocument xDoc = XDocument.Parse(httpResponseBody); 
      string name = (string)xDoc.Elements("field").First(x => x.Attribute("name").Value == "name"); 

「要素が一致しません」というエラーが表示されます。私がこれを試したり、何かを変更しようとすると、エラーを参照するように設定されていないオブジェクトが得られます。

私はここに簡単な解析ミスを犯しましたが、任意の助けをいただければ幸いと感じ

(だけでなく、私が間違って行ってきたところ、私は将来的にこれを防ぐために何を行うことができます!)

ありがとうございました!

+1

'文字列名= InnerText' –

+0

'Elements(" field ")'の代わりに 'Descendants(" field ")'を使用してください。xDoc.SelectSingleNode( "// field [@ name = 'name']" –

+0

@ MathiasR.JessenはLINQを使用することをお勧めしますが、XPathを使用する必要がある場合は 'xDoc.XPathSelectElement(...)'が必要です。 'XDocument'には' SelectSingleNode'メソッドはありません。 –

答えて

2

Elementsクエリは、現在のノードのの直下の子を検出します。すなわちElementsは、ルートlist要素のみを返します。 、

doc.Elements("list").Elements("resources").Elements(... 

それともDescendantsを使用できるので、現在のノードの多くの任意の子孫、以下となります:

これはあなたのようなクエリを実行する必要があることを意味いずれか

var name = (string)doc.Descendants("field") 
    .First(x => (string)x.Attribute("name") == "name"); 
+0

ありがとうございます、説明は完璧です:)。 – ForeverLearning

+0

清潔で素敵です。ありがとうございました! –

関連する問題