Недавно мне потребовалось преобразовать Rss в Xml нужного мне вида, для загрузки во временный кэш (ресурс с которого выкачивается Rss может быть не доступен, а данные нужны здесь и сейчас). Для этого мне понадобился всего лишь Linq2Xml.
-
public XElement Select()
-
{
-
return new XElement("root",
-
new XAttribute("key", "news_cache"),
-
XElement
-
.Load("rss_url")
-
.Element("channel")
-
.Elements("item")
-
.Take(5].ToInt()) //Нужно всего 5 новостей
-
.Select(i => new XElement("news",
-
new XAttribute("title", i.Element("title").Value),
-
new XAttribute("link", i.Element("link").Value),
-
new XAttribute("pubDate", i.Element("pubDate").Value),
-
new XAttribute("description", i.Element("description").Value))));
-
}
Пояснения к коду
1. Статический, защищенный от исключительных ситуаций, метод ToInt (преобразует строку в целочисленное значение):
-
public static int ToInt(this object value, int @default = 0)
-
{
-
int result;
-
if (ReferenceEquals(value, null)) return @default;
-
return int.TryParse(value.ToString(), out result)
-
? result
-
: @default;
-
}
2. Что делает код вообще?
Код создает Xml-документ с корнем "root", загружает с указанного адреса Rss, забирает нужные мне элементы, и дальше исполняется лямбда-выражение, которое и создает проекцию полученных данных в новый xml документ.
3. Полученный результат.
-
<root key="news_cache">
-
<news title="4 якоря и Морской Капитан выходят в основной этап Dreamleague #2" link="http://xgame.kz/4-yakorya-i-morskoj-kapitan-vyxodyat-v-osnovnoj-etap-dreamleague-2.html" pubDate="Thu, 23 Oct 2014 05:54:47 +0000" description="Квалификация на турнир Asus ROG Dreamleague #2 в регионе Западная Европа. В основной этап турнира из квалификаций выходило 2 команды, которые присоединились к приглашенным Alliance и Fnatic. Ими стали Team Tinker и 4 Anchors + Sea Capitan. Team Tinker без особых проблем прошлись по верхней сетке, не отдав ни одной карты соперникам. 4 Anchors +"/>
-
<news title="Анонс турнира по Dota 2 от Sulpak в городе Алматы" link="http://xgame.kz/anons-turnira-po-dota2-ot-sulpak-v-gorode-almaty.html" pubDate="Wed, 22 Oct 2014 11:14:04 +0000" description="Дорогие друзья! Компания Sulpak, совместно с Logitech, интернет порталом xGame.kz, платежной системой kaya.la и интернет-центром QWERTY, анонсируют турнир по Dota2. Турнир пройдет 16 ноября в интернет-центре QWERTY по адресу ул. Масанчи, угол ул. Шевченко. Призом победителям турнира станут девайсы на общую сумму 1 000 000 тенге. Зарегистрироваться на турнир вы можете, заполнив форму регистрации и"/>
-
<news title="Заключительные матчи xGame.kz на Synergy League" link="http://xgame.kz/zaklyuchitelnye-matchi-xgame-kz-na-synergy-league.html" pubDate="Wed, 22 Oct 2014 10:14:59 +0000" description="Сегодня команда xGame.kz проведет заключительные матчи турнира Synergy League. Соперниками xGame.kz будут команды Cleave и Kompas Gaming. Матч с Cleave начнется в 17:00 CEST (21:00 ALM). В 19:00 CEST (23:00 ALM) xGame.kz сыграет с KPG. Ситуация в группе такова: xGame.kz потеряли шансы на выход в следующий этап соревнований, но от их результата зависит то, кто"/>
-
<news title="Team Empire стала новым чемпионом Warface Open Cup" link="http://xgame.kz/team-empire-stala-novym-chempionom-warface-open-cup.html" pubDate="Wed, 22 Oct 2014 10:09:32 +0000" description="19 октября состоялся финал третьего открытого турнира серии Open Cup по игре Warface. Четыре лучшие команды разыграли между собой чемпионский титул и общий призовой фонд в размере более 1,5 миллиона рублей. Финал Open Cup: Осень прошел в московском офисе Mail.Ru Group, первое место досталось команде Team Empire. Серебряными и бронзовыми призерами Warface Open Cup стали коллективы ЧСВparty и Arena Stars соответственно, а четвертое место"/>
-
<news title="ТОП-10 самых богатых людей IT-персон Америки по версии Forbes" link="http://xgame.kz/top-10-samyx-bogatyx-lyudej-it-person-ameriki-po-versii-forbes.html" pubDate="Wed, 22 Oct 2014 08:20:06 +0000" description="За прошлый год Марк Цукерберг увеличил состояние в два раза, после того как Facebook исправил своё плачевное положение 2012 года. Так что сейчас положение CEO самой популярной социальной сети мира более чем хорошее. В этом году его состояние превысило прошлогоднее на 15 млрд долларов. В списке технологических богачей он занял третье место (на три строчки"/>
-
</root>
4. Другой путь.
5. Работа над ошибками.
Статический метод Load класса XElement обладает побочным эффектом - он может выкинуть в любой момент исключительную ситуацию, причем заранее неизвестно какую. Требуется: написать перегрузку статического метода - то есть создать чистую функцию без побочных эффектов. Рассматриваются любые варианты.