无法返回特定元素名称的所有实例。我可以退回一件商品,而不是全部。
这是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台服务器?
由于
答案 0 :(得分:2)
您需要使用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"));
答案 1 :(得分:1)
这样的事情怎么样:
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循环。