Рекурсивное чтение xml файла используя XmlReader - C#

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

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

Необходимо получить список всех дочерних элементов в xml, по отношению к родительским, те родительский элемент и список дочерних для него первого уровня вложенности и тд. Структура xml заранее не известна, размер тоже, поэтому для парсинга используется XmlReader. С помощью других механизмов возможен недостаток памяти при загрузке большой xml. Пробую использовать рекурсию для этого, код ниже:
static void recursive_read(XmlReader xmlr)
        {
            while (xmlr.Read())
            {
                xmlr.MoveToContent();
 
                if (xmlr.NodeType.ToString() == "Element")
                {
                    var innerxml = xmlr.ReadInnerXml();
                    var inreader = XmlReader.Create(new System.IO.StringReader(innerxml));
                    recursive_read(inreader);
                }
                else if (xmlr.NodeType.ToString() == "Text")
                {
 
                }
                else if (xmlr.NodeType.ToString() == "EndElement")
                {
 
                }
            }
Но при этом возникает ошибка если у родительского элемента более одного равнозначного вложенного ребенка. Можно это как нибудь обойти?

Решение задачи: «Рекурсивное чтение xml файла используя XmlReader»

textual
Листинг программы
static void recursive_read_first (XmlReader xmlr, string e)
        {
            var iterationResult = new List<string>();
            while (xmlr.Read())
            {
                xmlr.MoveToContent();
 
                if (xmlr.Name != e)
                {
                    if (xmlr.NodeType.ToString() == "Element")
                    {
                        Console.WriteLine(xmlr.Name);
                        iterationResult.Add(xmlr.Name);
                        recursive_read_first(xmlr.ReadSubtree(), xmlr.Name);
                        
                    }
                    else if (xmlr.NodeType.ToString() == "Text")
                    {
                        Console.WriteLine(xmlr.Value);
                        iterationResult.Add(xmlr.Value);
                    }
                    else if (xmlr.NodeType == XmlNodeType.EndElement)
                    {
                        Console.WriteLine("EndElement " + xmlr.Name);
                    }
                }
            }
            result.Add(iterationResult);           
        }

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


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

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

9   голосов , оценка 4.556 из 5
Похожие ответы