2015-09-12 2 views
0

При ссылке на это article Я получаю сообщение NullReferenceException, в котором указывается Object reference is not set to an instance of an object.. Я не уверен, как исправить это решение, поскольку я выполнил действия, описанные в моей статье.Ошибка чтения RSS-канала с использованием LINQ to XML

Модели

public class RssModel 
{ 
    public string Title { get; set; } 
    public string Link { get; set; } 
    public string Description { get; set; } 
    public string Image { get; set; } 

} 

public class ReadRssModel 
{ 
    public static List<RssModel> GetRss() 
    { 
     var client = new WebClient(); 

     var xmlData = client.DownloadString("http://finance.yahoo.com/rss/headline?s=msft,goog,aapl"); 

     XDocument xml = XDocument.Parse(xmlData); 

     var rssData = (from item in xml.Descendants("item") 
         select new RssModel 
         { 
          Title = ((string)item.Element("title")), 
          Link = ((string)item.Element("link")), 
          Description = ((string)item.Element("description")), 

          Image = ((string)item.Element("enclosure").Attribute("url")) 
         }).Take(20).ToList(); 

     return rssData; 

    } 
} 

ViewModel

public class RssViewModel 
{ 
    public List<RssModel> RssFeed { get; set; } 
} 

Контроллер

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     //return View(); 
     RssViewModel model = new RssViewModel(); 
     model.RssFeed = ReadRssModel.GetRss(); 
     return View(model); 
    } 
} 

Index

<div class="row"> 
<div class="col-md-8"> 
<h4>Feed</h4> 

    @foreach (var item in Model.RssFeed) 
    { 
     @item.Title <br /> 
     @item.Description <br/> 

    } 

</div> 

+1

Это потому, что в потомках 'item' нет элемента' enclosure'. –

+0

Итак, я начинаю понимать это сейчас, когда я извлекаю данные успешно. На самом деле нет изображения для каждого элемента элемента, только для элемента Channel. Итак, что я делаю, это на самом деле тянуть элементы элемента и НЕ элементы канала. Можете ли вы предложить, как сделать ссылку реальной гиперссылкой в ​​представлении? – Matthew

+0

WebClient реализует IDisposable, вы должны [обернуть свой WebClient с помощью предложения use] (https://msdn.microsoft.com/en-us/library/yh598w02.aspx). –

ответ

0

У вас есть два слоя тегов. Сначала канал, а затем предметы. См. Код ниже.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication47 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      XDocument xml = XDocument.Load("http://finance.yahoo.com/rss/headline?s=msft,goog,aapl"); 

      var results = xml.Descendants("channel").Select(x => new 
      { 
       Title = ((string)x.Element("title")), 
       Link = ((string)x.Element("link")), 
       Description = ((string)x.Element("description")), 
       Image = ((string)x.Element("image").Element("url")), 
       items = x.Elements("item").Take(20).Select(y => new { 
        title = (string)y.Element("title"), 
        link = (string)y.Element("link"), 
        description = (string)y.Element("description") 
       }).ToList(), 
      }).FirstOrDefault(); 

     } 

    } 
}