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

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

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

Необходимо получить список всех дочерних элементов в xml, по отношению к родительским, те родительский элемент и список дочерних для него первого уровня вложенности и тд. Структура xml заранее не известна, размер тоже, поэтому для парсинга используется XmlReader. С помощью других механизмов возможен недостаток памяти при загрузке большой xml. Пробую использовать рекурсию для этого, код ниже:
Листинг программы
  1. static void recursive_read(XmlReader xmlr)
  2. {
  3. while (xmlr.Read())
  4. {
  5. xmlr.MoveToContent();
  6. if (xmlr.NodeType.ToString() == "Element")
  7. {
  8. var innerxml = xmlr.ReadInnerXml();
  9. var inreader = XmlReader.Create(new System.IO.StringReader(innerxml));
  10. recursive_read(inreader);
  11. }
  12. else if (xmlr.NodeType.ToString() == "Text")
  13. {
  14. }
  15. else if (xmlr.NodeType.ToString() == "EndElement")
  16. {
  17. }
  18. }
Но при этом возникает ошибка если у родительского элемента более одного равнозначного вложенного ребенка. Можно это как нибудь обойти?

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

textual
Листинг программы
  1. static void recursive_read_first (XmlReader xmlr, string e)
  2.         {
  3.             var iterationResult = new List<string>();
  4.             while (xmlr.Read())
  5.             {
  6.                 xmlr.MoveToContent();
  7.  
  8.                 if (xmlr.Name != e)
  9.                 {
  10.                     if (xmlr.NodeType.ToString() == "Element")
  11.                     {
  12.                         Console.WriteLine(xmlr.Name);
  13.                         iterationResult.Add(xmlr.Name);
  14.                         recursive_read_first(xmlr.ReadSubtree(), xmlr.Name);
  15.                        
  16.                     }
  17.                     else if (xmlr.NodeType.ToString() == "Text")
  18.                     {
  19.                         Console.WriteLine(xmlr.Value);
  20.                         iterationResult.Add(xmlr.Value);
  21.                     }
  22.                     else if (xmlr.NodeType == XmlNodeType.EndElement)
  23.                     {
  24.                         Console.WriteLine("EndElement " + xmlr.Name);
  25.                     }
  26.                 }
  27.             }
  28.             result.Add(iterationResult);          
  29.         }

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


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

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

9   голосов , оценка 4.556 из 5

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

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

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