存在多个同名元素的C#Linq XML查询
林克是个新手。进行了搜索,但找不到确切的问题;试图从其他类似的答案中找到答案,但仍然无法得到 无法返回特定元素名称的所有实例。我可以退货一件,但不能全部退货 以下是XML:存在多个同名元素的C#Linq XML查询,c#,xml,linq,C#,Xml,Linq,林克是个新手。进行了搜索,但找不到确切的问题;试图从其他类似的答案中找到答案,但仍然无法得到 无法返回特定元素名称的所有实例。我可以退货一件,但不能全部退货 以下是XML: <?xml version="1.0"?> <printerlist> <list type="aff"> <printserver>print-server1</printserver> <printserver>print-ser
<?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>
这只生成printserver的第一个元素:print-server1
如何让foreach列出aff列表中的所有3台服务器
谢谢您需要使用
元素(“printserver”)
而不是元素(“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"));
var query = (from c in doc.Root.Descendants("list")
where (string)c.Attribute("type") == "aff"
select c).First().Elements("printserver"));
或者,如果您确定只有一个元素与where
子句匹配,则可以像这样使用First()
:
var query = (from c in doc.Root.Descendants("list")
where (string)c.Attribute("type") == "aff"
select c).SelectMany(c => c.Elements("printserver"));
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();
如果只需要每个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();
List elements=doc.Root.substands(“printserver”)
其中(e=>e.Parent.Name==“list”&&e.Parent.Attribute(“type”)。Value==“aff”)
.选择(p=>p.Value)
.ToList();
上述解决方案允许使用当前的foreach循环。可能是因为您使用的是c.Element而不是c.Element?我现在没有权限使用编译器来测试这个。嗨,上面的两个注释在直接叠加到现有代码上时都不起作用。他们可能需要更多的按摩。。。。但是谢谢你的输入,下面已经回答了。嗨。这也很好用。。。但我只能选择一个答案。在我的例子中,我试图将LINQ与传统的查询表示法结合使用(而不是Lambda,如果我理解正确的话,这是您提供的答案)。。。由于我仍在习惯林克,我想我会把这个传统作为我的答案。但是谢谢你-我会看看两者之间的区别。@Beatnik先生:当然,没问题!LINQ和Lambda经常一起使用。如果您有兴趣了解这两个方面的更多信息,请阅读这里:您好,谢谢,这很有效,并且与我使用传统查询的原始代码没有太大的距离。看到实现这一目标的不同方式是很有趣的。当我在以后扩展我的查询时,一种方法可能比另一种方法更好。用另一种可能的方法更新了我的答案。很高兴知道这个答案有帮助。