C # LINQ إلى تعبير استعلام XML ل Elemennt Exhist؟
-
18-09-2019 - |
سؤال
<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 لكل ما تريد
لا تنتمي إلى StackOverflow