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

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

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

Есть пример вот такого XML-файла
<?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>
У меня задача распарсить файл и получить коллекцию ключ - значение (Dictionary) в формате КОД_ГОРОДА - НАЗВАНИЕ_ГОРОДА. вот метод который я набрасал:
//парсер списка всех возможных городов //НЕ УВЕРЕН ЧТО ОПТИМАЛЬНАЯ РЕАЛИЗАЦИЯ!!!
            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();
        }
    }
}

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


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

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

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