【发布时间】:2016-05-01 09:08:38
【问题描述】:
我正在尝试使用 XML 属性标准获取元素的值。本质上,我只想要整个文档中的一个值,并且我一直在尝试直接查询它。这是我的 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>
特别是,我想要其中包含“名称”属性的字段。这是我为检索它所做的:
XDocument xDoc = XDocument.Parse(httpResponseBody);
string name = (string)xDoc.Elements("field").First(x => x.Attribute("name").Value == "name");
我收到“元素不匹配序列”错误。当我尝试对此进行试验或更改任何内容时,我得到一个对象未设置为引用错误。
我感觉我在这里犯了一个简单的解析错误,但任何帮助将不胜感激(以及我出错的地方以及将来我可以做些什么来防止这种情况发生!)
谢谢!
【问题讨论】:
-
string name = xDoc.SelectSingleNode("//field[@name='name']").InnerText -
使用
Descendants("field")而不是Elements("field")。 -
@MathiasR.Jessen 最好使用 LINQ,但如果必须使用 XPath,则需要
xDoc.XPathSelectElement(...)。XDocument上没有SelectSingleNode方法。 -
@CharlesMager 不错,正在考虑
XmlDocument -
试试这个:var results = xDoc.Descendants("field").Where(x => x.Attribute("name").Value == "name").FirstOrDefault();