我有以下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();
但是不断获得异常序列不包含任何元素。
知道我做错了吗?
由于
答案 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元素包含在结果中。显然你也遇到了套管问题。