【问题标题】:Why isn't this XElement query working on my xml为什么此 XElement 查询不适用于我的 xml
【发布时间】:2010-03-10 09:41:27
【问题描述】:

我的 xml 看起来像:

<nodes>
<node name="somekey">
<item name="subject">blah</item>
<item name="body">body</item>
</node>
</nodes>

到目前为止我的代码是:

XDocument doc = XDocument.Load(HttpContext.Current.Server.MapPath(String.Format("~/files/{0}/text.xml", "en")));

if (doc != null)
{
    XElement element = doc.Elements().Where(e => e.Elements().Any() && e.Attribute("name").Value == "someKey").First();
}

我收到一条错误消息:

Sequence contains no elements

我的查询错了吗?

我单步执行了代码,但它在 XElement 的行上出错了..

【问题讨论】:

  • 您的查询应该做什么?
  • 用=somekey键获取元素,然后我有其他代码来获取主题和正文的值。

标签: c# linq linq-to-xml xelement


【解决方案1】:

你想要这样的东西:

var element = doc.Descendants("node").Where(x => x.Attribute("name") != null && x.Attribute("name").Value == "somekey").FirstOrDefault();

编辑:已编辑以从结果中获取第一个元素;

【讨论】:

  • 好的,如果我删除“节点”,它会起作用,因为在根节点处调用后代。
【解决方案2】:

你也可以使用:

var element = doc.Elements()
                 .Elements()
                 .Where(e => (e.Elements().Any() 
                              && e.Attribute("name").Value == "somekey"))
                 .First();

解释:

doc.Elements() 抓取根元素,即nodes。然后.Elements() 选择它的子元素,它只是一个node。然后在该节点集上执行.Where(),这就是您想要的。 lambda 选择那些具有子元素的元素,并且还有一个属性“name”,值为“somekey”。

您的原始代码未获取 Child-of-Child-elements。因此,原始结果集为空。

您也可以使用 .Descendants() 来执行此操作,但对我来说,这感觉有点草率和松散。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-27
    • 2019-12-05
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2016-11-26
    相关资源
    最近更新 更多