我如何使用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();
但是要得到一个异常序列不包含元素。
任何想法我做错了什么?
感谢
答
匹配元素是大小写敏感的操作。
如。 !“交易” =“交易”
试试这个:
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();
答
鉴于你的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如果输入为空,所以缺少的元素将最终给你一个空结果。有时候这是件好事;其他时候,你真的想要一个例外。
我不使用LINQ到XML足够可以肯定的,但在这一眼,XML是大小写敏感的......是的LINQ to XML?请注意,这些元素是大写的,并且您的链接查询全是小写。如果区分大小写是一个问题,那么这会阻止您在查询中找到匹配项。 – David 2012-03-06 22:32:20
@DavidStratton你是对的,你应该写它作为答案。 – 2012-03-06 22:36:27
@DavidStratton我想您的评论转换为答案... :) – 2012-03-06 22:37:03