【问题标题】:Check against multiple elements with one query?用一个查询检查多个元素?
【发布时间】:2014-08-16 16:11:30
【问题描述】:

是否可以使用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 语句?

【问题讨论】:

  • where (string)c.Element("food") == "apple" 只检查与 food 匹配的第一个元素。
  • 除了第一个元素外,我如何检查与食物匹配的第二个元素?
  • ...your xml.... 之类的根目录括起该 xml
  • 我把它漏掉了,不过它又被附上了。

标签: c# linq-to-xml


【解决方案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"}

【讨论】:

  • 这正是我之后想要实现的。谢谢!
【解决方案2】:

您的代码不会在生成的 IEnumerable 中添加“Roger”,而是“apple”。我假设你想选择你的人的 name 元素。

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

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

应该做的伎俩

【讨论】:

  • 当我使用foreach 在结果中检查姓名时,我什么也没得到。
  • 查看这个 DotNetFiddle 示例 dotnetfiddle.net/Qw8cor 结果只是一个 IEnumerable
【解决方案3】:

使用 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

【讨论】:

    猜你喜欢
    • 2018-08-30
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    相关资源
    最近更新 更多