是否可以使用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语句?
答案 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");
答案 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"));
应该做的伎俩