LINQ to XML查询不读取我的XML文件

时间:2016-06-21 09:40:22

标签: c# xml linq

我在Book Store上创建了一个项目并希望提供折扣。我已经使用了XML文件,并尝试使用LINQ查询从该文件中检索数据,但是当我运行项目时,它会给我一个错误NullReferenceException。 这是LINQ查询的代码。

string discountFilePath = HttpContext.Current.Server.MapPath("/App_Data/DiscountSettings.xml");
XDocument xmlDoc = XDocument.Load(discountFilePath);
IEnumerable<XElement> filteredDiscounts;
filteredDiscounts = from d in xmlDoc.Descendants("Discount")
                    where Convert.ToDateTime(d.Element("StartDate").Value) < DateTime.Now 
                    && Convert.ToDateTime(d.Element("EndDate").Value) >= DateTime.Now
                    select d;
XElement discountElement = filteredDiscounts.LastOrDefault();
string discounCategory = discountElement.Element("GenreName").Value;

这是我的xml文件。

<?xml version="1.0" encoding="utf-8"?>
<DiscountDetails>
  <Discount>
    <GenreName>Biographies</GenreName>
    <StartDate>2016-05-01</StartDate>
    <EndDate>2016-05-31</EndDate>
    <DiscountPercentage>10</DiscountPercentage>
  </Discount>
</DiscountDetails>

请帮我解决这个问题

2 个答案:

答案 0 :(得分:1)

重要

使用LastOrDefault()方法时必须明白该方法可以返回对象(default(XElement))的默认值,并且可以为null,如果value为null,则需要chceck。例如,对于您的代码:

if (discountElement != null)
{
  string discounCategory = discountElement.Element("GenreName").Value;
}

执行此操作您的代码很好。问题是StartDateEndDate的XML文件和值。更改标记的值,因为您具有StartDat < DateTime.NowEndDate >= DateTime.Now之类的条件,例如像这样(今天)

    <StartDate>2016-05-01</StartDate>
    <EndDate>2017-05-31</EndDate>

filteredDiscounts.LastOrDefault();不会返回null,而且一切都会好的。

答案 1 :(得分:1)

检查XML中的日期。 filteredDiscounts 为空,因为您的日期错误且与您的选择无关(今天为2016-06-21

在这里,您尝试在null上调用LastOrDefault:

XElement discountElement = filteredDiscounts.LastOrDefault();