选择要列出Linq的元素

时间:2012-01-31 15:30:35

标签: c# xml linq

尝试提取"队列"的列表将元素放入新的Queue对象列表中。我有以下xml:

<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的类,其中包含这些属性。

3 个答案:

答案 0 :(得分:7)

您当前的方法发现“队列”然后只选择第一个“队列”项。它没有抓住所有这些。你想要做的是使用Descendants("Queue")或首先选择“Queues”元素,然后选择它的“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();

答案 1 :(得分:1)

c.Element("Queue")

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

答案 2 :(得分: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有点搞砸了。通过选择“队列”后代,您可以迭代它们,而不是总是在选择中选择第一个“队列”节点。我从来都不喜欢长形式的linq,从来没有运气结合链式和长形式。希望这有帮助!