2

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

4

2 回答 2

3

你想要这样的东西:

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

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

于 2010-03-09T23:42:22.863 回答
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()但对我来说感觉有点草率和松散。

于 2010-03-10T01:39:28.037 回答