【问题标题】:C# - Get value of xml element with its attributeC# - 使用其属性获取 xml 元素的值
【发布时间】: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();

标签: c# xml


【解决方案1】:

Elements 查询只查找当前节点的直接子节点。即Elements 只会返回根list 元素。

这意味着您需要像这样查询:

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

或者你可以使用Descendants,它将许多当前节点的任何后代,所以:

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

【讨论】:

  • 感谢您的解释,现在完美运行:)。
  • 干净漂亮。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 2021-05-07
相关资源
最近更新 更多