Невозможно выбрать в LINQ to XML, ошибка: ссылка на объект не установлена ​​на экземпляр объекта - PullRequest
0 голосов
/ 02 сентября 2011

Я новичок в использовании Linq to XML и столкнулся с довольно неприятной ошибкой.При попытке извлечь мой XML-файл я получаю сообщение об ошибке «Ссылка на объект не установлена ​​на экземпляр объекта».и это говорит, что ошибка в том, что я пытаюсь использовать оператор выбора нового.Я приложил свой код ниже:

 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 ]

9 голосов
/ 02 сентября 2011

Проблема в том, что вы используете свойство Value везде - оно всегда будет неудачным, если результат foo.Element(...) вернет ноль из-за отсутствия элемента.К счастью, есть простой способ обойти это - приведение к строке .Явное преобразование XElement в string возвращает ноль, если «input» равно 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> не имеетa <VehicleType>, <Vin>, <Status> или <Year> child.

Однако, если этот сбой фактически означает, что данные были недействительными для начала, в любом случае вы можете захотеть исключение.Это зависит от того, с какой степени вы полагаетесь на данные, с которых нужно начинать в разумных пределах.

2 голосов
/ 02 сентября 2011

Похоже, что один из VEHICLES узлов в ваших XML-данных не имеет Vin, VehicleType или Year

Попробуйте

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
};

или что-то ещевдоль этих линий

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...