Я пытаюсь заполнить мою модель данными из файла XML, но пока не увенчались успехом. Установка точки останова в переменной Res показывает нулевое значение.Ошибка привязки данных из XML в ASP.NET
Я также попытался загрузить файл XML локально, но результат был тот же.
Я использую VS2013, MVC.
Контроллер:
public ActionResult Index()
{
IQueryable<Restaurant> Res;
XDocument xmlDoc = XDocument.Load
("http://ratings.food.gov.uk/OpenDataFiles%5CFHRS501en-GB.xml");
var model =
from xml in xmlDoc.Descendants("EstablishmentDetail")
select new Restaurant
{
FHRSID = (int)xml.Element("FHRSID"),
BusinessName = (string)xml.Element("BusinessName"),
RatingValue = (int)xml.Element("RatingValue"),
HygieneScore = (int)xml.Element("Hygiene"),
};
Res = model.AsQueryable();
return View(Res);
}
Модель:
[XmlRoot("EstablishmentDetails")]
public class Restaurant
{
public int? RestaurantId { get; set; }
[XmlElement("FHRSID")]
public int FHRSID { get; set; }
[XmlElement("BusinessName")]
public string BusinessName { get; set; }
[XmlElement("RatingValue")]
public int? RatingValue { get; set; }
[XmlElement("Hygiene")]
public int? HygieneScore { get; set; }
}
Пример из файла XML:
<FHRSEstablishment>
<Header>
<ExtractDate>2014-09-19</ExtractDate>
<ItemCount>933</ItemCount>
<ReturnCode>Success</ReturnCode>
</Header>
<EstablishmentCollection>
<EstablishmentDetail>
<FHRSID>129104</FHRSID>
<LocalAuthorityBusinessID>5952</LocalAuthorityBusinessID>
<BusinessName>5 Elm's Cafe</BusinessName>
<RatingValue>3</RatingValue>
<Scores>
<Hygiene>10</Hygiene>
<Structural>10</Structural>
<ConfidenceInManagement>10</ConfidenceInManagement>
</Scores>
</EstablishmentDetail>
</EstablishmentCollection>
</FHRSEstablishment>
Я совершенно новой для веб-разработки в целом, это мой первый раз работа с файлами XML.
Новый контроллер:
public class RestaurantController : Controller
{
public static IEnumerable<Restaurant> GetData()
{
XDocument xmlDoc = XDocument.Load(@"~/Xml/OpenDataFiles_FHRS501en-GB.xml");
foreach (var xml in xmlDoc.Descendants("EstablishmentDetail"))
{
var eFHRSID = xml.Element("FHRSID");
var eBusinessName = xml.Element("BusinessName");
var eRatingValue = xml.Element("RatingValue");
var eHygieneScore = xml.Element("Scores").Element("Hygiene");
if (eFHRSID != null && eBusinessName != null && eRatingValue != null && eHygieneScore != null)
{
yield return new Restaurant
{
FHRSID = (int)eFHRSID,
BusinessName = (string)eBusinessName,
RatingValue = (int)eRatingValue,
HygieneScore = (int)eHygieneScore,
};
}
}
}
public ActionResult Index()
{
GetData();
return View();
}
Благодарим за это, вложенность в вашем примере кода имеет смысл. Возможно, как и ожидалось, теперь я получаю нулевую ошибку, в частности «Ссылка на объект не установлена в экземпляр объекта». Я пробовал несколько вещей, таких как установка свойств в качестве нулевых в модели и создание экземпляров переменных и назначение некоторого значения до того, как им будет присвоено значение из документа XML. Но ничто, кажется, не устраняет нулевую ошибку. Я добавил обновленный контроллер к исходному вопросу, если это поможет. – user3626232
Вы должны иметь возможность точно определить точную строку/член, который равен NULL. Используйте стек вызовов, трассировку стека и т. Д. Я вижу, что вы редактировали свой пост тем временем. Ваша модель имеет атрибуты сериализации xml. Переместились ли вы из LinqToXml в пользовательскую десериализацию? Исходный xml успешно разбирается с кодом в ответе. –