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

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

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

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

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

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Xml;
 
namespace ConsoleApplication85
{
    class Program
    {
        private const string NodeName = "way";
        static void Main()
        {
            var list = new List<Way>();
            using (var reader = XmlReader.Create("source.xml"))
            {
                while (reader.Read())
                {
                    switch (reader.NodeType)
                    {
                        case XmlNodeType.Element:
                            if (reader.Name == NodeName)
                            {
                                var way = GetWay(reader);
                                list.Add(way);
                            }
                            break;
                    }
                }
            }
 
            foreach (var way in list)
            {
                Console.WriteLine(way);
            }
        }
 
        private static Way GetWay(XmlReader reader)
        {
            var attributes = AttributesToDictionary(reader);
 
            var nds = new List<int>();
            Tag tag = null;
 
            while (reader.Read() && reader.Name != NodeName)
            {
                switch (reader.Name)
                {
                    case "nd":
                        if (reader.MoveToNextAttribute())
                            nds.Add(int.Parse(reader.Value));
                        break;
                    case "tag":
                        var dict = AttributesToDictionary(reader);
                        tag = new Tag()
                              {
                                  K = dict["k"],
                                  V = dict["v"]
                              };
                        break;
                }
            }
 
            return new Way
                   {
                       Id = Convert.ToInt32(attributes["id"]),
                       Version = Convert.ToInt32(attributes["version"]),
                       TimeStamp = Convert.ToDateTime(attributes["timestamp"]),
                       Uid = Convert.ToInt32(attributes["uid"]),
                       User = attributes["user"],
                       Changeset = Convert.ToInt64(attributes["changeset"]),
                       NdRefs = nds.ToArray(),
                       Tag = tag
                   };
        }
 
        private static Dictionary<string, string> AttributesToDictionary(XmlReader reader)
        {
            var attributes = new Dictionary<string, string>();
            while (reader.MoveToNextAttribute())
            {
                attributes.Add(reader.Name.ToLower(), reader.Value);
            }
            return attributes;
        }
    }
 
    public class Way
    {
        public int Id { get; set; }
        public int Version { get; set; }
        public DateTime TimeStamp { get; set; }
        public int Uid { get; set; }
        public string User { get; set; }
        public long Changeset { get; set; }
        public int[] NdRefs { get; set; }
        public Tag Tag { get; set; }
    }
 
    public class Tag
    {
        public string K { get; set; }
        public string V { get; set; }
    }
}

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


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

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

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