我如何使用LINQ读取XML

问题描述:

我有下面的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

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

如。 !“交易” =“交易”

试试这个:

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

鉴于你的XML,你应该改变这一行[编辑:鉴于你的XML使用Jon的回答]

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

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

这将阻止任何嵌套事务元素包含在结果中。显然你也有套管问题。

如果是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如果输入为空,所以缺少的元素将最终给你一个空结果。有时候这是件好事;其他时候,你真的想要一个例外。