2012-11-05 100 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。 。 –