用一个查询检查多个元素
本文关键字:检查 元素 查询 一个 | 更新日期: 2023-09-27 18:10:22
是否可以使用where
检查根内的多个元素?我以这样的方式设置了一个XML表,即有多个具有相同名称的元素(但只是有时),如:
<person>
<name>Joe</name>
<food>orange</food>
<food>apple</food>
</person>
<person>
<name>Roger</name>
<food>apple</food>
</person>
我希望能够检查一个人是否有特定类型的食物,然后将它们输出到控制台。使用以下方法从XML表中抓取它们:
var query = from c in xml.Root.Descendants("person")
where (string)c.Element("food") == "apple"
select new c.Element("food").Value;
它只会将Roger添加到查询中。我相信这是因为苹果排在第二位,因为当我把它换成第一名时,我让乔出现了。有没有一种方法可以检查第二个元素是否也满足where语句?
您可以尝试一下。它将返回一个包含名字和食物的投影,以证明它同时选择了两个:
var query = from c in xml.Root.Elements("person") //Descendants("person")
from f in c.Descendants("food")
where (string)f == "apple"
select new { Food = f.Value,Name = c.Element("name").Value };
查询输出:
{Food = "apple", Name = "joe"}
{Food = "apple", Name = "Roger"}
你的代码不会将"Roger"添加到结果IEnumerable中,而是"apple"。我假设您想选择您的人物的name
元素。
作为前面答案的另一种选择,您还可以搜索所有苹果,然后获得它们父母的name元素。
var result = xml.Root.Descendants("food")
.Where(x=> (string)x == "apple")
.Select(y=> (string)y.Parent.Element("name"));
使用Lambda(因为apple是硬编码的快捷方式):
var doc = XDocument.Parse(@"<root><person><name>Joe</name><food>orange</food><food>apple</food></person><person><name>Roger</name><food>apple</food></person></root>");
var results = doc.Root.Descendants("person")
.Where(p => p.Elements("food").Any(f => f.Value == "apple"))
.Select(p => "apple");
DotNetFiddle示例