Yvision.kz
kk
Разное
Разное
399 773 постов41 подписчиков
Всяко-разно
-9
00:45, 23 октября 2014

Простое преобразование Xml документа при помощи Linq2Xml.

Недавно мне потребовалось преобразовать Rss в Xml нужного мне вида, для загрузки во временный кэш (ресурс с которого выкачивается Rss может быть не доступен, а данные нужны здесь и сейчас). Для этого мне понадобился всего лишь Linq2Xml.

   
  1. public XElement Select()
  2. {
  3. return new XElement("root",
  4. new XAttribute("key", "news_cache"),
  5. XElement
  6. .Load("rss_url")
  7. .Element("channel")
  8. .Elements("item")
  9. .Take(5].ToInt()) //Нужно всего 5 новостей
  10. .Select(i => new XElement("news",
  11. new XAttribute("title", i.Element("title").Value),
  12. new XAttribute("link", i.Element("link").Value),
  13. new XAttribute("pubDate", i.Element("pubDate").Value),
  14. new XAttribute("description", i.Element("description").Value))));
  15. }

Пояснения к коду

 

1. Статический, защищенный от исключительных ситуаций, метод ToInt (преобразует строку в целочисленное значение):

   
  1. public static int ToInt(this object value, int @default = 0)
  2. {
  3. int result;
  4. if (ReferenceEquals(value, null)) return @default;
  5. return int.TryParse(value.ToString(), out result)
  6. ? result
  7. : @default;
  8. }
 

2. Что делает код вообще?

Код создает Xml-документ с корнем "root", загружает с указанного адреса Rss, забирает нужные мне элементы, и дальше исполняется лямбда-выражение, которое и создает проекцию полученных данных в новый xml документ.

3. Полученный результат.

   
  1. <root key="news_cache">
  2. <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 +"/>
  3. <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 тенге. Зарегистрироваться на турнир вы можете, заполнив форму регистрации и"/>
  4. <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 потеряли шансы на выход в следующий этап соревнований, но от их результата зависит то, кто"/>
  5. <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 соответственно, а четвертое место"/>
  6. <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 млрд долларов. В списке технологических богачей он занял третье место (на три строчки"/>
  7. </root>
 

4. Другой путь.

5. Работа над ошибками.

Статический метод Load класса XElement обладает побочным эффектом - он может выкинуть в любой момент исключительную ситуацию, причем заранее неизвестно какую. Требуется: написать перегрузку статического метода - то есть создать чистую функцию без побочных эффектов. Рассматриваются любые варианты.

-9
470
0