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个服务器?

谢谢

c# Linq XML查询存在多个相同名称的元素

您需要使用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

相关文章: