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(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д