2014-10-27 2 views
0

Я пытаюсь заполнить мою модель данными из файла 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(); 
    } 

ответ

0

оборонительное программирование. Выполняйте нулевые проверки или исключайте исключения. Элемент «Гигиена» находится под «Scores», поэтому вам нужен xml.Element("Scores").Element("Hygiene") вместо xml.Element("Hygiene"). Это может быть вариант:

public static IEnumerable<Restaurant> GetData () 
{ 
    XDocument xmlDoc = XDocument.Load("http://ratings.food.gov.uk/OpenDataFiles%5CFHRS501en-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, 
     }; 
    } 
    } 
} 
+0

Благодарим за это, вложенность в вашем примере кода имеет смысл. Возможно, как и ожидалось, теперь я получаю нулевую ошибку, в частности «Ссылка на объект не установлена ​​в экземпляр объекта». Я пробовал несколько вещей, таких как установка свойств в качестве нулевых в модели и создание экземпляров переменных и назначение некоторого значения до того, как им будет присвоено значение из документа XML. Но ничто, кажется, не устраняет нулевую ошибку. Я добавил обновленный контроллер к исходному вопросу, если это поможет. – user3626232

+0

Вы должны иметь возможность точно определить точную строку/член, который равен NULL. Используйте стек вызовов, трассировку стека и т. Д. Я вижу, что вы редактировали свой пост тем временем. Ваша модель имеет атрибуты сериализации xml. Переместились ли вы из LinqToXml в пользовательскую десериализацию? Исходный xml успешно разбирается с кодом в ответе. –

Смежные вопросы