Парсинг XML документа со сложной структурой - C#

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

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

Доброго времени суток. Возникла проблема с парсингом .osm файла. Для чтения документа решил использовать xmlReader, т.к. он лучше всего работает с большими файлами. Все было отлично пока не встретил текст такого вида:
Листинг программы
  1. <way id="22845917" version="2" timestamp="2013-11-26T01:40:53Z" uid="534149" user="lurlrlrl" changeset="19120099">
  2. <nd ref="4"/>
  3. <nd ref="3"/>
  4. <nd ref="2"/>
  5. <tag k="waterway" v="canal"/>
  6. </way>
Все атрибуты way он читает отлично, но как мне выцепить теги <nd ref="4"/> или <tag k="waterway" v="canal"/> и считать их параметры ума не приложу. Вот пример того как файл читаю:
Листинг программы
  1. using (XmlReader xml = XmlReader.Create("q.osm"))
  2. {
  3. while (xml.Read())
  4. {
  5. switch (xml.NodeType)
  6. {
  7. case XmlNodeType.Element:
  8. // нашли элемент к примеру node
  9. if (xml.Name == "node")
  10. {
  11. if (xml.HasAttributes)
  12. {
  13. // поиск атрибута к примеру id
  14. while (xml.MoveToNextAttribute())
  15. {
  16. if (xml.Name == "id")
  17. {
  18. node_id = xml.Value;
  19. }

Решение задачи: «Парсинг XML документа со сложной структурой»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Xml;
  4.  
  5. namespace ConsoleApplication85
  6. {
  7.     class Program
  8.     {
  9.         private const string NodeName = "way";
  10.         static void Main()
  11.         {
  12.             var list = new List<Way>();
  13.             using (var reader = XmlReader.Create("source.xml"))
  14.             {
  15.                 while (reader.Read())
  16.                 {
  17.                     switch (reader.NodeType)
  18.                     {
  19.                         case XmlNodeType.Element:
  20.                             if (reader.Name == NodeName)
  21.                             {
  22.                                 var way = GetWay(reader);
  23.                                 list.Add(way);
  24.                             }
  25.                             break;
  26.                     }
  27.                 }
  28.             }
  29.  
  30.             foreach (var way in list)
  31.             {
  32.                 Console.WriteLine(way);
  33.             }
  34.         }
  35.  
  36.         private static Way GetWay(XmlReader reader)
  37.         {
  38.             var attributes = AttributesToDictionary(reader);
  39.  
  40.             var nds = new List<int>();
  41.             Tag tag = null;
  42.  
  43.             while (reader.Read() && reader.Name != NodeName)
  44.             {
  45.                 switch (reader.Name)
  46.                 {
  47.                     case "nd":
  48.                         if (reader.MoveToNextAttribute())
  49.                             nds.Add(int.Parse(reader.Value));
  50.                         break;
  51.                     case "tag":
  52.                         var dict = AttributesToDictionary(reader);
  53.                         tag = new Tag()
  54.                               {
  55.                                   K = dict["k"],
  56.                                   V = dict["v"]
  57.                               };
  58.                         break;
  59.                 }
  60.             }
  61.  
  62.             return new Way
  63.                    {
  64.                        Id = Convert.ToInt32(attributes["id"]),
  65.                        Version = Convert.ToInt32(attributes["version"]),
  66.                        TimeStamp = Convert.ToDateTime(attributes["timestamp"]),
  67.                        Uid = Convert.ToInt32(attributes["uid"]),
  68.                        User = attributes["user"],
  69.                        Changeset = Convert.ToInt64(attributes["changeset"]),
  70.                        NdRefs = nds.ToArray(),
  71.                        Tag = tag
  72.                    };
  73.         }
  74.  
  75.         private static Dictionary<string, string> AttributesToDictionary(XmlReader reader)
  76.         {
  77.             var attributes = new Dictionary<string, string>();
  78.             while (reader.MoveToNextAttribute())
  79.             {
  80.                 attributes.Add(reader.Name.ToLower(), reader.Value);
  81.             }
  82.             return attributes;
  83.         }
  84.     }
  85.  
  86.     public class Way
  87.     {
  88.         public int Id { get; set; }
  89.         public int Version { get; set; }
  90.         public DateTime TimeStamp { get; set; }
  91.         public int Uid { get; set; }
  92.         public string User { get; set; }
  93.         public long Changeset { get; set; }
  94.         public int[] NdRefs { get; set; }
  95.         public Tag Tag { get; set; }
  96.     }
  97.  
  98.     public class Tag
  99.     {
  100.         public string K { get; set; }
  101.         public string V { get; set; }
  102.     }
  103. }

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


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

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

10   голосов , оценка 4.2 из 5

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

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

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