使用一个查询检查多个元素?

时间:2014-06-25 22:45:40

标签: c# linq-to-xml

是否可以使用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添加到查询中。我相信这是因为苹果排名第二,因为当我把它切换到列表中的第一位时,我让Joe出现。有没有办法检查第二个元素是否符合where语句?

3 个答案:

答案 0 :(得分:1)

你可以尝试一下。它将返回一个带有名称和食物的投影,以证明它已经选择了两者:

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"}

答案 1 :(得分:0)

使用Lambda(由于苹果是硬编码的短切割):

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 Example

答案 2 :(得分:0)

您的代码不会添加&#34; Roger&#34;,但&#34; apple&#34;得到的IEnumerable。我假设您要选择人员的name元素。

作为上一个答案的替代方法,您还可以搜索所有苹果,然后获取其父母的名称元素。

var result = xml.Root.Descendants("food")
    .Where(x=> (string)x == "apple")
    .Select(y=> (string)y.Parent.Element("name"));

应该做的伎俩