2012-03-06 70 views
1

我有下面的XML我如何使用LINQ讀取XML

<Transaction><TransactionID>1559183866</TransactionID><Email>[email protected]</Email><Frequency>Yearly</Frequency><Amount>10</Amount><Status>1</Status><CreateDate>2/7/2012 8:29:43 AM</CreateDate></Transaction> 

我試圖使用鏈接創建一個對象引用的內容

XDocument result = XDocument.Load(readStream); 

var detail = (from x in result.Descendants("transaction") 
       select new { 
        TransactionID = x.Element("transactionid").Value, 
        Frequency = x.Element("frequency").Value, 
        Amount = x.Element("amount").Value, 
        Email = x.Element("email").Value, 
        Status = x.Element("status").Value 
       }).First(); 

但是要得到一個異常序列不包含元素。

任何想法我做錯了什麼?

感謝

+5

我不使用LINQ到XML足夠可以肯定的,但在這一眼,XML是大小寫敏感的......是的LINQ to XML?請注意,這些元素是大寫的,並且您的鏈接查詢全是小寫。如果區分大小寫是一個問題,那麼這會阻止您在查詢中找到匹配項。 – David 2012-03-06 22:32:20

+0

@DavidStratton你是對的,你應該寫它作爲答案。 – 2012-03-06 22:36:27

+0

@DavidStratton我想您的評論轉換爲答案... :) – 2012-03-06 22:37:03

回答

4

匹配元素是大小寫敏感的操作。

如。 !「交易」 =「交易」

試試這個:

var detail = (from x in result.Descendants("Transaction") 
          select new { 
           TransactionID = x.Element("TransactionID").Value, 
           Frequency = x.Element("Frequency").Value, 
           Amount = x.Element("Amount").Value, 
           Email = x.Element("Email").Value, 
           Status = x.Element("Status").Value }) 
           .First(); 
+1

該死!你擊敗了我!我終於讓我的代碼工作。爲你+1。 – David 2012-03-06 22:41:11

+0

對不起,沒有看到您的評論! – 2012-03-06 22:44:20

+0

沒問題。就像我說的,我不確定。我只是在猜測,你把我打敗了。 – David 2012-03-06 22:53:27

0

鑑於你的XML,你應該改變這一行[編輯:鑑於你的XML使用Jon的回答]

var detail = (from x in result.Descendants("Transaction") 

var detail = (from x in result.Element("Transaction") 

這將阻止任何嵌套事務元素包含在結果中。顯然你也有套管問題。

4

如果是XML的整個,然後你讓生活更復雜得多,你需要。該Transaction元素是根元素,你知道還會有隻有一個:

XDocument result = XDocument.Load("test.xml"); 

// Just for brevity 
var x = result.Root; 
var detail = new { 
      // Note the fixed capitalization 
      TransactionID = x.Element("TransactionID").Value, 
      Frequency = x.Element("Frequency").Value, 
      Amount = x.Element("Amount").Value, 
      Email = x.Element("Email").Value, 
      Status = x.Element("Status").Value 
     }; 
Console.WriteLine(detail); 

當然,如果這是一個更大的文檔的一部分,那麼你可以使用:

var x = result.Descendants("Transaction").First(); 
// Same as before 

你可能要考慮使用顯式轉換從XElement各種其他類型的,順便說一句。例如:

var detail = new { 
      // Note the fixed capitalization 
      TransactionID = (string) x.Element("TransactionID"), 
      Frequency = (string) x.Element("Frequency"), 
      Amount = (int) x.Element("Amount"), 
      Email = (string) x.Element("Email"), 
      Status = (int) x.Element("Status") 
     }; 

注意,任何強制類型可空類型(無論是引用類型或空值類型)只會返回null如果輸入爲空,所以缺少的元素將最終給你一個空結果。有時候這是件好事;其他時候,你真的想要一個例外。