用一个查询检查多个元素

本文关键字:检查 元素 查询 一个 | 更新日期: 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示例