2009-12-09 1 views
1
<channel> 
     <title>Best Web Gallery - Flash + CSS Gallery</title> 
     <link>http://bestwebgallery.com</link> 
     <description>Featuring the world best web design</description> 
     <pubDate>09 Dec 2009</pubDate>  
     <generator>http://wordpress.org/?v=2.3.2</generator> 
     <language>en</language> 
</channel> 


<channel> 
     <title>Best Web Gallery - Flash + CSS Gallery</title> 
     <link>http://bestwebgallery.com</link> 
     <description>Featuring the world best web design</description> 

      // pubDate missing 

     <generator>http://wordpress.org/?v=2.3.2</generator> 
     <language>en</language> 
</channel> 




    XDocument rssFeed = XDocument.Load(url); 

        var feedResources = from details in rssFeed.Descendants("channel") 
            select new feedResource 
            { 
             Title = details.Element("title").Value, 
             Host = details.Element("link").Value, 
             Description = details.Element("description").Value, 

             PublishedOn = DateTime.Parse(details.Element("pubDate").Value), 
             Generator = details.Element("generator").Value, 
             Language = details.Element("language").Value 
            }; 

Как мы можем проверить здесь, прежде чем пытаться получить элемент «pubDate» или другие, потому что, если не отмечен, выбрасывает исключение ссылочной ссылки?C# LINQ to XML Query Expression для eximist elemennt?

ответ

3

Не используйте Parse и т.д.; xml обычно использует разные представления строк, чем принимает; просто отбрасывать (обратите внимание, не .Value):

select new FeedResource 
{ 
    Title = (string)details.Element("title"), 
    Host = (string)details.Element("link"), 
    Description = (string)details.Element("description"), 
    PublishedOn = (DateTime?)details.Element("pubDate"), 
    Generator = (string)details.Element("generator"), 
    Language = (string)details.Element("language") 
} 

XElement имеет операторы преобразования, чтобы сделать всю работу, возвращая соответствующие значения.

+0

О, это круто. Я этого не знал. +1 – Zooba

+0

Спасибо, друг, хорошая работа –

2

Мое личное предпочтение, чтобы добавить два метода расширения для XElement:

public static string ValueOrDefault(this XElement xml) 
{ 
    if (xml == null) return null; // or String.Empty, if you prefer 
    return xml.Value 
} 

public static string ValueOrDefault(this XElement xml, string defaultValue) 
{ 
    if (xml == null) return defaultValue; 
    return xml.Value 
} 

Теперь ваш код будет выглядеть примерно так:

select new feedResource 
{ 
    Title = details.Element("title").ValueOrDefault(), 
    Host = details.Element("link").ValueOrDefault(), 
    Description = details.Element("description").ValueOrDefault(), 

    PublishedOn = DateTime.Parse(details.Element("pubDate").ValueOrDefault(DateTime.Now.ToString())), 
    Generator = details.Element("generator").ValueOrDefault(), 
    Language = details.Element("language").ValueOrDefault() 
}; 
-1

Просто измените строку:

PublishedOn = DateTime.Parse(details.Element("pubDate").Value), 

для:

PublishedOn = details.Element("pubDate") != null? DateTime.Parse(details.Element("pubDate").Value) : DateTime.Now, 

вы можете изменить DateTime.Now для все, что вы хотите