Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存在多个同名元素的C#Linq XML查询_C#_Xml_Linq - Fatal编程技术网

存在多个同名元素的C#Linq 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:

<?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经常一起使用。如果您有兴趣了解这两个方面的更多信息,请阅读这里:您好,谢谢,这很有效,并且与我使用传统查询的原始代码没有太大的距离。看到实现这一目标的不同方式是很有趣的。当我在以后扩展我的查询时,一种方法可能比另一种方法更好。用另一种可能的方法更新了我的答案。很高兴知道这个答案有帮助。