Linq to XML没有获得所有节点

时间:2012-11-05 06:46:59

标签: c# xml linq linq-to-xml

<?xml version="1.0" encoding="utf-8"?>
<OrdersReport Date="2012-08-01">
<Returns>
      <Amount>
        <OrderId>2</OrderId>
        <OrderId>3</OrderId>
        <OrderId>21</OrderId>
        <OrderId>23</OrderId>
      </Amount>
    </Returns>
</OrdersReport>

这是我试图获得OrderId的代码:

 var amount = doc.Descendants("Amount")                         
  .Select(y => new
  {
   OrderId = (int)y.Element("OrderId")
   });
foreach (var r in amount)
  {
   Console.WriteLine(r.OrderId);
  }

 Console.Read();

我的输出是:

2
2

3 个答案:

答案 0 :(得分:3)

你可以这样做:

var orderIds = doc.Descendants("OrderId");
foreach (var orderId in orderIds)
{
    Console.WriteLine(orderId.Value);
}

或者,在这种情况下将是相同的:

var orders = doc.Descendants("Amount")
                .Descendants("OrderId");

答案 1 :(得分:2)

var orderIds = doc.Descendants("OrderId")
                  .Select(e => e.Value)
                  .ToArray();

结果将是:

[2, 3, 21, 23]

答案 2 :(得分:1)

仅供参考信息

XContainer.Descendants Method (XName) - 按文档顺序返回此文档或元素的后代元素的过滤集合。只有具有匹配XName的元素才会包含在集合中。

所以在您的代码中

var amount = doc.Descendants("Amount")                         
  .Select(y => new
  {
   OrderId = (int)y.Element("OrderId")
   });

这会给你元素Amount,当你写y.Element("OrderId")时,它会返回你孩子的第一个元素。

所以要获取所有订单ID元素,您需要写下doc.Descendants("OrderId")documentRoot.Descendants("Amount").Descendants()

Descendants - 并不意味着它返回你在desendant方法中写的元素名的子元素。


最后以正确的方式为我解决方案

XElement documentRoot  = XElement.Parse (@"<OrdersReport Date='2012-08-01'>
                                                  <Returns>
                                                      <Amount>
                                                             <OrderId>21</OrderId>
                                                             <OrderId>3</OrderId>
                                                        </Amount>
                                                </Returns>
                                                </OrdersReport>");

           var orderids = from order in
                             documentRoot.Descendants("Amount").Descendants()
                          select new
                          {
                              OrderId = order.Value
                          };