2016-05-01 70 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

干净,漂亮。谢谢! –

相关问题