只有节点

时间:2018-05-10 19:33:07

标签: linq linq-to-xml

我正在尝试使用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。我使用所有字符串作为属性值,因为它们只是用作文本而不会被解析。

4 个答案:

答案 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。
  • 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()返回的集合中选择一个。