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();
}
}
}