2009-10-29 4 views
0

У меня есть следующий XMLатом пространства имен с помощью LINQ

<?xml version="1.0" encoding="UTF-8"?> 
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"> 
<entry><id><![CDATA[text]]></id>< 
author><name><![CDATA[film24]]></name></author><title><![CDATA[text]]></title> 
<updated>2009-10-30T15:55:13+00:00</updated><published>2009-10-30T00:00:00+00:00</published> 
<media:thumbnail type="image/jpeg" title="thumbnail" url=""/> 
<media:content type="video/flv" title="video" url="" expression="high"/> 
<media:content type="video/flv" title="video" url="" expression="low"/> 
</entry> 
</feed> 

Если я включать следующее пространство имен я не могу запросить XML-файл. т.е. он не возвращает никаких результатов.

http://www.w3.org/2005/Atom

Вот как я запрос XML-

 XNamespace nsMedia = "http://search.yahoo.com/mrss/"; 
     XNamespace nsAtom = "http://www.w3.org/2005/Atom"; 

     string url = HttpContext.Current.Server.MapPath(ConfigHelper.GetValue("FeedUri")); 
     var feed = XElement.Load(url); 
     var posts = from c in feed.Descendants(nsAtom + "entry") 
        select new CDNEntry 
        { 
         Id = (string)c.Element(nsAtom + "id").Value, 
         Author = (string)c.Element(nsAtom + "author").Value, 
         Title = (c.Element("title") != null) ? (string)c.Element(nsAtom + "title").Value : "", 
         Summary = (c.Element("summary") != null) ? (string)c.Element(nsAtom + "summary").Value : "", 
         Thumbnail = (string)c.Element(nsMedia + "thumbnail").Attribute(nsAtom + "url").Value, 
         FLV = (string)c.Element(nsMedia + "content").Attribute(nsAtom + "url").Value, 
         Updated = DateTime.Parse((string)c.Element(nsAtom + "updated").Value), 
         Published = DateTime.Parse((string)c.Element(nsAtom + "published").Value) 
        }; 

     return posts.ToList(); 
+0

Вы проверили, что uniqueUrl соответствует хотя бы одному элементу «id»? В качестве первого шага я рекомендую временно удалить ваш lambda, чтобы определить, соответствует ли проблема идентификатору или проблеме со структурой вашего оператора linq. –

+0

привет, Райан, да, я пробовал это. Для уточнения это не работает, когда включен «xmlns =» http://www.w3.org/2005/Atom ». – frosty

ответ

2

Ваш образец XML был отрезан, но ваша проблема, скорее всего, что вам нужно использовать больше пространства имен. Попробуйте что-то вроде этого:

XNamespace nsMedia = "http://search.yahoo.com/mrss/"; 
XNamespace nsAtom = "http://www.w3.org/2005/Atom"; 

var feed = GetFeed(); 
var posts = from c in feed.Descendants(nsAtom + "entry") 
      where (string)c.Element(nsAtom + "id") == uniqueUrl 
      select new CDNEntry 
      { 
       Id = (string)c.Element(nsAtom + "id"), 
       Author = (string)c.Element(nsAtom + "author"), 
       Title = (string)c.Element(nsAtom + "title") ?? "", 
       Summary = (string)c.Element(nsAtom + "summary") ?? "", 
       Thumbnail = (string)c.Element(nsMedia + "thumbnail").Attribute("url"), 
       FLV = (string)c.Element(nsMedia + "content").Attribute("url"), 
       Updated = (DateTime)c.Element(nsAtom + "updated"), 
       Published = (DateTime)c.Element(nsAtom + "published") 
      }; 
+0

спасибо, очень ценю ваш ответ. Я уверен, что вы правы. Tho я просто не могу похоже, правильно заполняет пространство имен. Я обновил свой код выше, чтобы отобразить все xml – frosty

+0

. Вы действительно близко, вам просто нужно удалить пространства имен из атрибута («url»). Вместо использования свойства Value, которое может вызывают нулевые ссылочные исключения, как вы видите, я предпочитаю использовать различные явные приведения, которые предоставляет XElement. Кастинг для строки просто возвращает значение в любом случае, но он просто возвращает null, если элемент не существует. Аналогично, приведение в DateTime (или DateTime? для поддержки нулей) является более чистым, чем синтаксический анализ строки. – dahlbyk

+0

классный, ну, вы не знаете, что такое оператор. – frosty