c# Linq XML查询存在多个相同名称的元素
本文关键字:元素 XML Linq 查询 存在 | 更新日期: 2023-09-27 18:18:12
我是Linq新手。搜索了一下,没有找到一个确切的问题;我试着从其他与相似的答案中找出答案,但仍然无法理解。
无法返回特定元素名称的所有实例。我可以退货一件,但不是全部。
下面是XML:
<?xml version="1.0"?>
<printerlist>
<list type="aff">
<printserver>print-server1</printserver>
<printserver>print-server2</printserver>
<printserver>print-server3</printserver>
</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 query = from c in xml.Root.Descendants("list")
where (string)c.Attribute("type") == "aff"
select c.Element("printserver");
foreach (string name in query)
{
Console.WriteLine("Server Name: {0}", name);
}
这只产生printserver的第一个元素:print-server1如何让foreach列出aff列表中的所有3个服务器?
谢谢
您需要使用Elements("printserver")
代替Element("printserver")
,如下所示:
var query = (from c in doc.Root.Descendants("list").Elements("printserver")
where (string)c.Parent.Attribute("type") == "aff"
select c);
或者像这样使用SelectMany()
:
var query = (from c in doc.Root.Descendants("list")
where (string)c.Attribute("type") == "aff"
select c).SelectMany(c => c.Elements("printserver"));
或者如果您确定只有一个元素匹配where
子句,您可以像这样使用First()
:
var query = (from c in doc.Root.Descendants("list")
where (string)c.Attribute("type") == "aff"
select c).First().Elements("printserver"));
这样如何:
List<XElement> elements = doc.Root.Descendants("printserver")
.Where(e => e.Parent.Name == "list" && e.Parent.Attribute("type").Value == "aff")
.ToList();
然后,如果你想循环遍历元素:
foreach (XElement e in elements)
{
Console.WriteLine("Server Name : {0}", e.Value);
}
如果您只想要每个printserver的字符串值,请在末尾使用.Select:
List<string> elements = doc.Root.Descendants("printserver")
.Where(e => e.Parent.Name == "list" && e.Parent.Attribute("type").Value == "aff")
.Select(p => p.Value)
.ToList();
上面的解决方案允许使用你当前的foreach-loop