2
<?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
4

3 回答 3

3

你可以做:

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

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

var orders = doc.Descendants("Amount")
                .Descendants("OrderId");
于 2012-11-05T06:55:23.273 回答
2
var orderIds = doc.Descendants("OrderId")
                  .Select(e => e.Value)
                  .ToArray();

结果将是:

[2, 3, 21, 23]
于 2012-11-05T07:02:24.310 回答
1

仅供参考

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

所以在你的代码中

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

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

因此,要获取所有 OrderID 元素,您需要写下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
                          };
于 2012-11-05T07:21:10.627 回答