筛选后代父级[或至少高于结果级别]
本文关键字:结果 高于 后代 筛选 | 更新日期: 2023-09-27 18:18:32
仍然是Linq新手,现在在WHERE子句上有问题。我试图返回在打印机标签中找到的任何东西,但只能从元素列表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"))
您还可以使用System.Xml.XPath名称空间中的XPath选择器:
var doc = XDocument.Parse(xml);
var printers = doc.XPathSelectElements("//list[@type='lff']/additionalprinters/printer");