Во-первых, я никогда не использовал RSS.NET, но мне было интересно, осознали ли вы, что у .NET Framework есть свои собственные API-интерфейсы RSS в пространстве имен System.ServiceModel.Syncidation
. Класс SyndicationFeed
является отправной точкой для этого.
Чтобы ответить на ваш вопрос, я написал небольшой пример, который берет канал для этого вопроса и записывает title , author , id и rank (интересующий вас элемент расширения) для консоли. Это должно показать, насколько прост этот API и как получить доступ к rank .
// load the raw feed
using (var xmlr = XmlReader.Create("https://stackoverflow.com/feeds/question/1813559"))
{
// get the items within a feed
var feedItems = SyndicationFeed
.Load(xmlr)
.GetRss20Formatter()
.Feed
.Items;
// print out details about each item in the feed
foreach (var item in feedItems)
{
Console.WriteLine("Title: {0}", item.Title.Text);
Console.WriteLine("Author: {0}", item.Authors.First().Name);
Console.WriteLine("Id: {0}", item.Id);
// the extensions assume that there can be more than one value, so get
// the first or default value (default == 0)
int rank = item.ElementExtensions
.ReadElementExtensions<int>("rank", "http://purl.org/atompub/rank/1.0")
.FirstOrDefault();
Console.WriteLine("Rank: {0}", rank);
}
}
Приведенный выше код приводит к записи следующего сообщения в консоль ...
Title: .NET / C #: Использование RSS.NET с лентами переполнения стека: как обрабатывать специальные свойства элементов RSS
Автор: Максим З.
Id: .NET / C #: Использование RSS.NET с лентами переполнения стека: как обрабатывать специальные свойства элементов RSS?
Ранг: 0
Для получения дополнительной информации о классе SyndicationFeed перейдите по этой ссылке ...
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.aspx
Некоторые примеры чтения и записи расширенных значений из RSS-каналов приведены здесь ...
http://msdn.microsoft.com/en-us/library/bb943475.aspx
Что касается создания ваших экземпляров Вопроса, я не уверен, что с сериализацией можно быстро выиграть. Я бы, наверное, написал твой код примерно так ...
var questions = from item in feedItems
select
new Question
{
Title = item.Title.Text,
Author = item.Authors.First().Name,
Id = item.Id,
Rank = item.ElementExtensions.ReadElementExtensions<int>(
"rank", "http://purl.org/atompub/rank/1.0").FirstOrDefault()
};
... но он делает то же самое.
Для вышеперечисленного необходимо установить библиотеки .NET 3.5. Следующее не делает, но требует C # 3.5 (который создаст сборки, предназначенные для .NET 2.0)
Я хотел бы предложить вам одну вещь: не создавайте пользовательские типы, а вместо этого пишите методы расширения для типа SyndicationItem. Если вы позволяете своим пользователям иметь дело с SyndicationType (тип, который поддерживается, понимается, документируется и т. Д.), Но добавляете методы расширения для облегчения доступа к специфическим свойствам SO, то вы облегчаете жизнь пользователя, и они всегда могут использовать API SyndicationItem, когда ваш ТАК расширения не делают то, что они хотят. Так, например, если вы написали этот метод расширения ...
public static class SOExtensions
{
public static int Rank(this SyndicationItem item)
{
return item.ElementExtensions
.ReadElementExtensions<int>("rank", "http://purl.org/atompub/rank/1.0")
.FirstOrDefault();
}
}
... вы можете получить доступ к званию синдикационного элемента, как это ...
Console.WriteLine("Rank: {0}", item.Rank());
... и когда SO добавляет какое-либо другое свойство расширения в фид, который вы не указали для пользователя вашего API, может вернуться к просмотру коллекции ElementExtensions.
Одно окончательное обновление ...
Я не использовал библиотеку Rss.NET, но прочитал онлайн-документы. Из первоначального прочтения этих документов я бы предположил, что нет способа добраться до элемента расширения, к которому вы пытаетесь получить доступ (Ранг элемента). Если API RSS.NET разрешает доступ к xml для данного RssItem (и я не уверен, что это так), то вы могли бы использовать механизм метода расширения для дополнения класса RssItem.
Я считаю SyndicationFeed API очень мощным и очень простым для понимания, поэтому, если вам подходит вариант .NET 3.5, я бы пошел в этом направлении.