XMLTextReader чтение по фрагментам - C#

Узнай цену своей работы

Формулировка задачи:

Есть пример вот такого XML-файла
Листинг программы
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <gismeteo_codes>
  3. <item>
  4. <gismeteo_code>37021</gismeteo_code>
  5. <city_name>Майкоп</city_name>
  6. <region_code>1</region_code>
  7. <region_name>Адыгея респ.</region_name>
  8. </item>
  9. <item>
  10. <gismeteo_code>28722</gismeteo_code>
  11. <city_name>Уфа</city_name>
  12. <region_code>2</region_code>
  13. <region_name>Башкортостан респ.</region_name>
  14. </item>
  15. <item>
  16. <gismeteo_code>30823</gismeteo_code>
  17. <city_name>Улан удэ</city_name>
  18. <region_code>3</region_code>
  19. <region_name>Бурятия респ.</region_name>
  20. </item>
  21. <item>
  22. <gismeteo_code>36052</gismeteo_code>
  23. <city_name>Горноалтайск</city_name>
  24. <region_code>4</region_code>
  25. <region_name>Алтай респ.</region_name>
  26. </item>
  27. <item>
  28. <gismeteo_code>37472</gismeteo_code>
  29. <city_name>Махачкала</city_name>
  30. <region_code>5</region_code>
  31. <region_name>Дагестан респ.</region_name>
  32. </item>
  33. <item>
  34. <gismeteo_code>99946</gismeteo_code>
  35. <city_name>Назрань</city_name>
  36. <region_code>6</region_code>
  37. <region_name>Ингушетия респ.</region_name>
  38. </item>
  39. <item>
  40. <gismeteo_code>37212</gismeteo_code>
  41. <city_name>Нальчик</city_name>
  42. <region_code>7</region_code>
  43. <region_name>Кабардино-Балкарская респ.</region_name>
  44. </item>
  45. <item>
  46. <gismeteo_code>34861</gismeteo_code>
  47. <city_name>Элиста</city_name>
  48. <region_code>8</region_code>
  49. <region_name>Калмыкия респ.</region_name>
  50. </item>
  51. <item>
  52. <gismeteo_code>37116</gismeteo_code>
  53. <city_name>Карачаевск</city_name>
  54. <region_code>9</region_code>
  55. <region_name>Карачаево-Черкессия респ.</region_name>
  56. </item>
  57. </gismeteo_codes>
У меня задача распарсить файл и получить коллекцию ключ - значение (Dictionary) в формате КОД_ГОРОДА - НАЗВАНИЕ_ГОРОДА. вот метод который я набрасал:
Листинг программы
  1. //парсер списка всех возможных городов //НЕ УВЕРЕН ЧТО ОПТИМАЛЬНАЯ РЕАЛИЗАЦИЯ!!!
  2. public Dictionary<int,string> ScanBaseNumberCity(string fileName)
  3. {
  4. //информация о всех возможных городах
  5. //находится в xml-файле "gismeteo.xml"
  6. //Суть:
  7. //метод парсит файл с городами и заполняет таблицу(словарь) ключ->значение
  8. //ключ - код города, значение - название города
  9. //возвращает эту коллекцию для последующего добавления города
  10. Dictionary<int, string> allCity = new Dictionary<int, string>();
  11. XmlTextReader reader = null;
  12. try
  13. {
  14. reader = new XmlTextReader(fileName);
  15. reader.WhitespaceHandling = WhitespaceHandling.None;
  16. while (reader.Read()) //перебираю все элементы
  17. {
  18. if (reader.Name == "item") //в элементах с тэгом item беру данные
  19. {
  20. //значения кода и города
  21. int codeCity = new int();
  22. string nameCity = null;
  23. reader.Read(); //переход на след элемент
  24. while (reader.Name != "item") //пока не дойду до конца блока item
  25. {
  26. switch (reader.Name)
  27. {
  28. case "gismeteo_code":
  29. int.TryParse(reader.ReadString(), out codeCity); //перевожу значение в целочисленный тип, при этом указатель переходит на конец блока
  30. //в </gismeteo_code>
  31. break;
  32. case "city_name":
  33. nameCity = reader.ReadString(); //аналогично как и по коду города
  34. break;
  35. }
  36. reader.Read(); //вращаю цикл перебора элементов
  37. }
  38. //проверка что и код и название города были считаны
  39. if (!String.IsNullOrEmpty(nameCity) && codeCity != 0)
  40. allCity[codeCity] = nameCity;
  41. }
  42. }
  43. }
  44. finally
  45. {
  46. if (reader != null) reader.Close();
  47. }
  48. return allCity;
  49. }
Вопрос собственно в следующем - меня терзают смутные сомнения, что я сделал это кустарно и наверняка есть стандартные средства нахождения части документа и парсинг отдельной части. Я как видите сделал общим переьором с небольшим замудрением.

Решение задачи: «XMLTextReader чтение по фрагментам»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Xml.Linq;
  6.  
  7. namespace ConsoleApplication25 {
  8.     class Program {
  9.         static void Main(string[] args) {
  10.             var result = XElement.Load(@"C:\Test.xml").Descendants("item").Select(el => new { Code = int.Parse(el.Element("region_code").Value), City = el.Element("city_name").Value });
  11.             foreach (var r in result) {
  12.                 Console.WriteLine("Code: {0}, City: {1}", r.Code, r.City);
  13.             }
  14.             Console.ReadLine();
  15.         }
  16.     }
  17. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.625 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут