gpt4 book ai didi

c# - 过滤后代 parent [或至少比结果更高级别]

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:57 25 4
gpt4 key购买 nike

这里仍然是 Linq 新手,现在遇到 WHERE 子句问题。我正在尝试返回在 printer 标签中找到的所有内容,但仅限于元素 list type="lff" 下方。

如果我尝试输出不带 WHERE 子句的后代元素,我会得到所有内容(来自两个 <list> 元素)。当我尝试添加 WHERE 子句的各种版本时,我什么也没得到。我显然没有正确设置 WHERE 条件。

(我需要获取元素对象,所以我可以检查 NAME 和 VALUE。在我下面的示例中,我现在只输出 VALUE)。

你能给个建议吗?

这是 XML:

<?xml version="1.0"?>
<printerlist>
<list type="aff">
<printserver>print-server1</printserver>
<printserver>print-server2</printserver>
<printserver>print-server3</printserver>
<additionalprinters>
<printer>
<fullname>\\servera\bbb</fullname>
</printer>
</additionalprinters>
</list>
<list type="lff">
<printserver>print-sever4</printserver>
<additionalprinters>
<printer>
<fullname>\\serverb\bbb</fullname>
</printer>
<printer>
<fullname>\\serverc\aaa</fullname>
</printer>
</additionalprinters>
</list>
</printerlist>

下面是尝试获取列表的代码:

var qq = from c in xml.Descendants("additionalprinters").Descendants("printer")
//where (string) c.Parent.Attribute("type") == "lff"
//Uncommenting the above line means that nothing is returned.
select c;
foreach (XElement q in qq)
{
Console.WriteLine("Test Output: {0}", q.Value );
}

输出是:

Test Output: \\servera\bbb
Test Output: \\serverb\bbb
Test Output: \\serverc\aaa

在这种特殊情况下,我只查找要返回的最后两个输出。

最佳答案

printer 的父级是additionalprinters 并且它没有type 属性,你需要使用.Parent 两次以获取 list 元素。

from c in xml.Descendants("additionalprinters").Descendants("printer")
where (string) c.Parent.Parent.Attribute("type") == "lff"
select c

或者你也可以这样做

xml.Descendants("list")
.Where(c => (string) c.Attribute("type") == "lff")
.SelectMany(x => x.Element("additionalprinters").Descendants("printer"))

关于c# - 过滤后代 parent [或至少比结果更高级别],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25359752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com