Рекурсивное чтение 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);
}