我如何使用Linq读取XML

时间:2012-03-06 22:30:43

标签: c# linq linq-to-xml

我有以下XML

<Transaction><TransactionID>1559183866</TransactionID><Email>joe@xyz.com</Email><Frequency>Yearly</Frequency><Amount>10</Amount><Status>1</Status><CreateDate>2/7/2012 8:29:43 AM</CreateDate></Transaction>

我正在尝试使用link来创建一个引用内容的对象

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();

但是不断获得异常序列不包含任何元素。

知道我做错了吗?

由于

3 个答案:

答案 0 :(得分: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 :(得分: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时返回null,因此缺少的元素最终会给出null结果。有时这是件好事;其他时候你真的想要一个例外。

答案 2 :(得分:0)

鉴于您的XML,您应该更改此行[编辑:给出您的XML使用Jon的答案]

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

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

这将阻止任何嵌套的Transaction元素包含在结果中。显然你也遇到了套管问题。