2011-03-16 113 views
0

我正在模擬將返回XElement的Web服務。該服務從數據庫中創建XElement。爲了擁有本地測試服務,我創建了一個模擬XML元素列表的XML文檔。我希望選擇並通過LINQ將其中的一個返回到XML。如何使用LINQ to XML返回XElement?

所以我有一個XML文檔:

<?xml version="1.0" encoding="utf-8" ?> 
<customers> 
    <customer ordercode="GCT/12345A"> 
     <title>Miss</title> 
     <initials>A</initials> 
     <surname>Customer</surname> 
     ... 
    </customer> 
    <customer ordercode="GCT/12346A"> 
     <title>Mrs</title> 
     <initials>AN</initials> 
     <surname>Other</surname> 
     ... 
    </customer> 
</customers> 

而且使用LINQ我想選擇由ordercode屬性客戶元素之一。我只需要基本上刪除客戶節點的InnerXML並返回。我試着解析:

XElement xcust = (XElement)(from c in xdocument.Descendants("customer") 
       where c.Attribute("ordercode") == strorder 
       return c).Single(); 

但它沒有工作。我也試過:

return new XElement("customer", [same LINQ Query]); 

我猜我需要以某種方式查詢所選客戶的InnerXML查詢,但我不知道該怎麼做。由於大多數人只是將XML直接解析爲所需的對象(因爲我模擬遠程服務的響應,我不能這麼做),因此我只能返回原始元素,因爲我猜測這是一個一個邊緣案例使用的位。

回答

5

您需要檢查屬性的Value屬性:

XElement xcust = (XElement)(from c in doc.Descendants("customer") 
       where c.Attribute("ordercode").Value == strorder 
       select c).Single(); 

也可以省略劇組來的XElement。

+0

你是正確的,但它應該是'Attribute'不'Attributes'(去掉 「的」)。另外,可以省略對'XElement'的轉換。 – 2011-03-16 13:46:15

+0

我注意到了,我想我在複製粘貼原始代碼時太快了:) – Botz3000 2011-03-16 13:47:12

+0

完全正確,我最初使用了Attribute。屬性是我的一個錯字。 – 2011-03-16 13:48:36

0

當然,我太傻了:

where c.Attribute("ordercode") == strorder 

應該是:

where c.Attribute("ordercode").Value.ToString() == strorder. 

然後,它不隨它跳過。

+0

僅供參考'ToString()'不需要,因爲'Value'返回'string'。 – 2011-03-16 13:49:55

+0

叫我偏執狂;) – 2011-03-16 13:58:59

0

嘗試:

var res = (from c in xdocument.Element("customers").Elements() 
      let attr = c.Attribute("ordercode") 
      where attr != null && attr.Value == strorder 
      select c).Single();