无法在LINQ to XML中选择,错误:对象引用未设置为对象的实例

时间:2011-09-01 20:37:44

标签: xml linq linq-to-xml

我是使用Linq到XML的新手,遇到了一个相当棘手的错误。当我试图拉入我的XML文件时,我收到一条错误,上面写着“对象引用没有设置为对象的实例”。并且它说错误是因为我试图使用select新语句。我在下面附上了我的代码:

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Web;
 using System.Web.UI;
 using System.Web.UI.WebControls;
 using System.Xml.Linq;
 public partial class _Default : System.Web.UI.Page
 {
 protected void Page_Load(object sender, EventArgs e)
 {
     XDocument feed = XDocument.Load(Server.MapPath("VEHICLES.XML"));
     var query = from c in feed.Descendants("VEHICLES")
                 where (string) c.Element("VehicleType").Value == "0"
                 select new
                 {
                     Vin = c.Element("Vin").Value,
                     Status = c.Element("VehicleType").Value,
                     Year = c.Element("Year").Value
                 };

    CarLister.DataSource = query;
    CarLister.DataBind();
  }
}

使用select c可以很好地拉入所有节点;而不是selectnew,但理想情况下我只想选择某些信息,并且在拉入它们时我需要修改一些条目。我不确定是什么导致了这个问题所以任何指针或想法如何如果您需要任何其他信息,请立即修复它。

2 个答案:

答案 0 :(得分:9)

问题是你在任何地方使用Value属性 - 如果foo.Element(...)的结果因缺少元素而返回null,则总是会失败。幸运的是,有一种简单的方法 - cast to string。如果“input”为null,XElement显式转换为string将返回null,这非常方便。

var query = from c in feed.Descendants("VEHICLES")
            where (string) c.Element("VehicleType") == "0"
            select new
            {
                Vin = (string) c.Element("Vin"),
                Status = (string) c.Element("VehicleType"),
                Year = (string) c.Element("Year")
            };

如果<VEHICLES>元素没有<VehicleType><Vin><Status><Year>子元素,那么这将会存在。

但是,如果此失败实际上意味着数据开始时无效,则无论如何都可能需要例外。这取决于你开始依赖数据的理智程度。

答案 1 :(得分:2)

您的xml数据中的VEHICLES个节点之一看起来没有VinVehicleTypeYear

尝试

select new
{
    Vin = c.Element("Vin") == null ? "" : e.Element("Vin").Value,
    Status = c.Element("VehicleType") == null ? "" : e.Element("VehicleType").Value,
    Year = c.Element("Year") == null ? "" : e.Element("Year").Value
};

或沿着这些方向的东西