簡體   English   中英

C#Linq XML Query存在多個同名元素

[英]C# Linq XML Query where multiple elements of same name exist

林克新手在這里。 搜索了,找不到確切的問題; 試圖從其他類似的答案工作,但仍然無法得到它。

無法返回特定元素名稱的所有實例。 我可以退回一件商品,而不是全部。

這是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列出關聯列表中的所有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循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM