2012-01-31 80 views
1

尝试将“队列”元素列表提取到队列对象的新列表中。我有以下xml:选择要列表的元素Linq

<MSMQData> 
<Queues> 
    <Queue env="LOCAL" server="WORK150">FormatName:DIRECT=OS:WKSTN150\private$\localqueue1</Queue> 
    <Queue env="TEST" server="TEST01">FormatName:DIRECT=OS:dev-test01\private$\testqueue</Queue> 
    <Queue env="PROD" server="empty"></Queue> 
    <Queue env="PROD" server="empty"></Queue> 
</Queues> 
</MSMQData> 

这是我的代码,显然不会给我带回队列元素列表,我试图检索。我在这里错过了什么?

var queues = (from col in xmlMSMQLoad.Descendants("Queues") 
       select col) 
      .Select(c => new Queue 
      { 
       Environment = c.Element("Queue").Attribute("env").Value, 
       Server = c.Element("Queue").Attribute("server").Value, 
       QueueName = c.Element("Queue").Value 
      }) 
      .ToList(); 

通过我的方式有一类称为Queue在它这些属性。

+0

你的代码看起来像队列是一个列表()。你期待什么,你的实际结果是什么? – jrummell 2012-01-31 15:34:33

+0

我只收到第一个“队列”元素。尝试获取所有“队列”元素。 – DotNetDude 2012-01-31 15:37:32

+0

[DISTINCT,SUM,COUNT给定XML的DataTable](http://izlooite.blogspot.com/2010/10/how-to-distinct-sum-count-datatable-for.html) – 2012-03-04 14:53:24

回答

7

您目前的方法找到“队列”,然后只选择第一个“队列”项目。它并没有全部抓住它们。你想要做的是使用Descendants("Queue")或首先选择“队列”元素,然后选择其“队列”元素。

使用此查询,而不是:

var queues = (from c in xml.Element("Queues").Elements("Queue") 
      select new Queue 
      { 
       Environment = c.Attribute("env").Value, 
       Server = c.Attribute("server").Value, 
       QueueName = c.Value 
      }).ToList(); 
+0

真棒工作就像一个魅力!感谢艾哈迈德和所有谁评论! – DotNetDude 2012-01-31 15:52:44

1

c.Element("Queue")

c"Queues"元素,c.Element("Queue")第一"Queue"元素。因此你只能得到第一个。

1
var queues = doc 
     .Descendants("Queue") 
     .Select(x => new Queue 
      { 
       Env = x.Attribute("env").Value, 
       Server = x.Attribute("server").Value, 
       QueueName = x.Value 
      }) 
     .ToList(); 

你是linq有点搞砸了。通过选择“队列”后代,您可以遍历它们而不是始终选择选择中的第一个“队列”节点。我从来没有喜欢过这种长长的形式,并且从来没有把链式和长形合并在一起。希望这可以帮助!