为什么这个XElement查询不能用于我的xml

时间:2010-03-09 23:23:31

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

我的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的行上出错..

2 个答案:

答案 0 :(得分:3)

你想要这样的东西:

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

编辑:编辑从结果中抓取第一个元素;

答案 1 :(得分:2)

你也可以使用:

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

说明:

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

您的原始代码未获得Child-of-Child元素。因此原始结果集是空的。

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