XMLTextReader чтение по фрагментам - C#
Формулировка задачи:
Есть пример вот такого XML-файла
У меня задача распарсить файл и получить коллекцию ключ - значение (Dictionary) в формате КОД_ГОРОДА - НАЗВАНИЕ_ГОРОДА.
вот метод который я набрасал:
Вопрос собственно в следующем - меня терзают смутные сомнения, что я сделал это кустарно и наверняка есть стандартные средства нахождения части документа и парсинг отдельной части.
Я как видите сделал общим переьором с небольшим замудрением.
Листинг программы
- <?xml version="1.0" encoding="utf-8" ?>
- <gismeteo_codes>
- <item>
- <gismeteo_code>37021</gismeteo_code>
- <city_name>Майкоп</city_name>
- <region_code>1</region_code>
- <region_name>Адыгея респ.</region_name>
- </item>
- <item>
- <gismeteo_code>28722</gismeteo_code>
- <city_name>Уфа</city_name>
- <region_code>2</region_code>
- <region_name>Башкортостан респ.</region_name>
- </item>
- <item>
- <gismeteo_code>30823</gismeteo_code>
- <city_name>Улан удэ</city_name>
- <region_code>3</region_code>
- <region_name>Бурятия респ.</region_name>
- </item>
- <item>
- <gismeteo_code>36052</gismeteo_code>
- <city_name>Горноалтайск</city_name>
- <region_code>4</region_code>
- <region_name>Алтай респ.</region_name>
- </item>
- <item>
- <gismeteo_code>37472</gismeteo_code>
- <city_name>Махачкала</city_name>
- <region_code>5</region_code>
- <region_name>Дагестан респ.</region_name>
- </item>
- <item>
- <gismeteo_code>99946</gismeteo_code>
- <city_name>Назрань</city_name>
- <region_code>6</region_code>
- <region_name>Ингушетия респ.</region_name>
- </item>
- <item>
- <gismeteo_code>37212</gismeteo_code>
- <city_name>Нальчик</city_name>
- <region_code>7</region_code>
- <region_name>Кабардино-Балкарская респ.</region_name>
- </item>
- <item>
- <gismeteo_code>34861</gismeteo_code>
- <city_name>Элиста</city_name>
- <region_code>8</region_code>
- <region_name>Калмыкия респ.</region_name>
- </item>
- <item>
- <gismeteo_code>37116</gismeteo_code>
- <city_name>Карачаевск</city_name>
- <region_code>9</region_code>
- <region_name>Карачаево-Черкессия респ.</region_name>
- </item>
- </gismeteo_codes>
Листинг программы
- //парсер списка всех возможных городов //НЕ УВЕРЕН ЧТО ОПТИМАЛЬНАЯ РЕАЛИЗАЦИЯ!!!
- public Dictionary<int,string> ScanBaseNumberCity(string fileName)
- {
- //информация о всех возможных городах
- //находится в xml-файле "gismeteo.xml"
- //Суть:
- //метод парсит файл с городами и заполняет таблицу(словарь) ключ->значение
- //ключ - код города, значение - название города
- //возвращает эту коллекцию для последующего добавления города
- Dictionary<int, string> allCity = new Dictionary<int, string>();
- XmlTextReader reader = null;
- try
- {
- reader = new XmlTextReader(fileName);
- reader.WhitespaceHandling = WhitespaceHandling.None;
- while (reader.Read()) //перебираю все элементы
- {
- if (reader.Name == "item") //в элементах с тэгом item беру данные
- {
- //значения кода и города
- int codeCity = new int();
- string nameCity = null;
- reader.Read(); //переход на след элемент
- while (reader.Name != "item") //пока не дойду до конца блока item
- {
- switch (reader.Name)
- {
- case "gismeteo_code":
- int.TryParse(reader.ReadString(), out codeCity); //перевожу значение в целочисленный тип, при этом указатель переходит на конец блока
- //в </gismeteo_code>
- break;
- case "city_name":
- nameCity = reader.ReadString(); //аналогично как и по коду города
- break;
- }
- reader.Read(); //вращаю цикл перебора элементов
- }
- //проверка что и код и название города были считаны
- if (!String.IsNullOrEmpty(nameCity) && codeCity != 0)
- allCity[codeCity] = nameCity;
- }
- }
- }
- finally
- {
- if (reader != null) reader.Close();
- }
- return allCity;
- }
Решение задачи: «XMLTextReader чтение по фрагментам»
textual
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Xml.Linq;
- namespace ConsoleApplication25 {
- class Program {
- static void Main(string[] args) {
- 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 });
- foreach (var r in result) {
- Console.WriteLine("Code: {0}, City: {1}", r.Code, r.City);
- }
- Console.ReadLine();
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д