我的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的行上出错..
答案 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()
执行此操作,但这对我来说感觉有点草率和松散。