2012-11-05 64 views
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代码:的LINQ to XML没有得到所有节点

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 

回答

1

只为信息undersand这个正确

XContainer.Descendants Method (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方法writtne元素名称的子元素。


最后以下为我解决工作中有道

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 
          }; 
3

你可以这样做:

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

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

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

+1 ....简单的方法来得到它direcly .. –

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

结果将是:

[2, 3, 21, 23] 
+1

+1 ....简单的方法来得到它direcly。 。 –