2016-05-01 71 views
0

我正在嘗試使用XML屬性條件來獲取元素的值。基本上我只想從整個文檔中獲取一個值,並且我一直試圖直接查詢它。這是我的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

'字符串名稱= xDoc.SelectSingleNode(「// field [@ name ='name']」)。InnerText' –

+0

使用'Descendants(「field」)'而不是'Elements(「field」)'。 –

+0

@使用LINQ的MathiasR.Jessen是首選,但如果您必須使用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

乾淨,漂亮。謝謝! –

相關問題