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

有帮助吗?

解决方案

您想是这样的:

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

修改编辑,以抓住从结果第一元件;

其他提示

您也可以使用:

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

说明:

doc.Elements()抓住根元素,其是nodes。然后.Elements()选择的是子元素,这只是其中的一个,node。该.Where()然后在该节点集,这是你想要的执行。拉姆达选择那些有子元素,也有一个“name”属性值为“somekey”元素。

您原始代码没有得到的小孩子的 - 子元素。因此,原来的结果集是空的。

您也可以做到这一点与.Descendants()但感觉有点草率和松,给我。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top