C# LINQXML查询-如何返回在自己的嵌套节点中满足条件的节点?
我有以下xml结构:C# LINQXML查询-如何返回在自己的嵌套节点中满足条件的节点?,c#,xml,linq,C#,Xml,Linq,我有以下xml结构: <?xml version="1.0" encoding="utf-8" ?> <administrators> <administrator> <fullname>full name1</fullname> <email>email1@email.com</email> <provinces> <province>3<
<?xml version="1.0" encoding="utf-8" ?>
<administrators>
<administrator>
<fullname>full name1</fullname>
<email>email1@email.com</email>
<provinces>
<province>3</province>
<province>9</province>
</provinces>
</administrator>
<administrator>
<fullname>full name2</fullname>
<email>email2@email.com</email>
<provinces>
<province>1</province>
<province>2</province>
</provinces>
</administrator>
</administrators>
全名1
email1@email.com
3.
9
全名2
email2@email.com
1.
2.
我希望能够返回具有特定省节点的管理员节点。我尝试了以下方法:
IEnumerable<Administrator> admins = RootElement.Elements("administrator")
.Where(x => x.Elements("provinces")
.Any(p => int.Parse(p.Element("province").Value) == provinceId))
.Select(x => new Administrator()
{
FullName = x.Element("fullname").Value,
Email = x.Element("email").Value
});
IEnumerable admins=RootElement.Elements(“管理员”)
.其中(x=>x.元素(“省”)
.Any(p=>int.Parse(p.Element(“省”).Value==provinceId))
.Select(x=>newadministrator()
{
FullName=x.Element(“FullName”).Value,
Email=x.Element(“Email”).值
});
我的结果集是空的
那么我在这里错过了什么?如果provinceId=3,如何选择具有等于provinceId的省元素的管理员元素?这是使用XPath的一个好例子:
RootElement.XPathSelectElements("//administrator[provinces/province = '" + provinceId + "']");
IEnumerable admins=RootElement.Elements(“管理员”)
.其中(x=>x.元素(“省”)
.SelectMany(p=>p.Elements(“省”))
.Any(p=>int.Parse(p.Value==provinceId))
.Select(x=>newadministrator()
{
FullName=x.Element(“FullName”).Value,
Email=x.Element(“Email”).值
});
(我还没有对此进行测试。)实际上,您是在尝试返回管理员元素,还是构造等效的管理员对象?您有一个拼写错误,缺少“r”:RootElement.Elements(“管理员”)@František:我想您已经解决了这个问题。把它贴出来作为答案!不完全是这样,它仍然不起作用-将条件构造成
Any
-解析p.Element(“省”)
的值使它只检查省的第一个子省。
IEnumerable<Administrator> admins = RootElement.Elements("administrator")
.Where(x => x.Elements("provinces")
.SelectMany(p => p.Elements("province"))
.Any(p => int.Parse(p.Value) == provinceId))
.Select(x => new Administrator()
{
FullName = x.Element("fullname").Value,
Email = x.Element("email").Value
});
var admins = RootElement.Elements("administrator")
.Where( a => a.Descendants("province").Any( p => int.Parse(p.Value) == provinceId ) );