سؤال

<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" أو غيرها، لأنه إذا لم يتم التحقق، يلقي استثناء مرجعي فارغ؟

هل كانت مفيدة؟

المحلول

لا تستخدم 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 لديه مشغلي التحويل للقيام بكل الأعمال، وعودة القيم المناسبة.

نصائح أخرى

تفضيلي الشخصي هو إضافة طريقتين تمديدا إلى 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()
};

فقط تغيير الخط:

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

بالنسبة:

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

يمكنك تغيير DateTime.Now لكل ما تريد

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top