[英]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.