我正在尝试使用Linq查询一些XML。我有以下XML片段......
<report>
<invoice>
<id>A4245</id>
<date>12-20-2016</date>
<amount>12.50</amount>
</invoice>
<report>
这是我保存数据的模型
public class InvoiceModel
{
public string InvoiceId { get; set; }
public string InvoiceDate { get; set; }
public string InvoiceAmount { get; set; }
}
这是LINQ查询
XDocument xml = XDocument.Parse(@"C:\Path\To\data.xml");
InvoiceModel invoice = xml.Descendants("invoice")
.Select(x => new InvoiceModel
{
InvoiceId = x.Element("id").Value.ToString(),
InvoiceDate = x.Element("date").Value.ToString(),
InvoiceAmount = x.Element("amount").Value.ToString()
});
我得到的错误是......
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<InvoiceModel>' to 'InvoiceModel'. An explicit conversion exists (are you missing a cast?)
XML中只有一张发票。如何判断LINQ查询只有一个发票实例,而且不需要IEnumerable
?
P.S。我使用所有字符串作为属性值,因为它们只是用作文本而不会被解析。
答案 0 :(得分:3)
您可以使用.FirstOrDefault()
选择唯一的invoice
元素:
InvoiceModel invoice = xml.Descendants("invoice")
.Select(x => new InvoiceModel
{
InvoiceId = x.Element("id").Value.ToString(),
InvoiceDate = x.Element("date").Value.ToString(),
InvoiceAmount = x.Element("amount").Value.ToString()
})
.FirstOrDefault();
您的代码中还有其他问题:
XDocument.Load
加载文件,Parse
用于原始xml。</report>
。答案 1 :(得分:1)
尝试
request.getCookies()
答案 2 :(得分:1)
这是因为 private final Group cameraGroup = new Group(camera);
private final Group lightGroup = new Group();
private final Group objectsGroup = new Group();
private final Group root = new Group(cameraGroup, lightGroup, objectsGroup);
会返回Descendants(...)
,然后会将IEnumerable<T>
转换为Select
。如果您知道最多只有一个具有正确名称的后代,请使用IEnumerable<InvoiceModel>
来检索它:
FistsOrDefault()
答案 3 :(得分:1)
.Select()
返回一个集合。如果该集合中只有一个元素,请追加:
.Single()
如果有多个,你想要第一个:
.First()
如果应该有一个但可能没有:
.SingleOrDefault()
等
您可以应用各种逻辑,并为任何IEnumerable<T>
提供各种扩展方法。基本上,如果您只想要一个,请从.Select()
返回的集合中选择一个。