У меня есть проблема, которая не дает мне спать по ночам. Это довольно долго объяснять, поэтому спасибо заранее за то время, которое вы посвятили этой теме.
Контекст
Я хочу создать класс в C #, чтобы получить весь контент XML-файла с именами узлов в качестве индекса и отсортированным по дереву, используя комбинации списков и словарей.
Цель состоит в том, чтобы иметь возможность получить доступ к определенным данным, используя имена и индексы, например:
Console.WriteLine(xmlContent["employee"][0]["e-mail"][1]);
//Would return the second email from the first employee register in the xml file.
Я почти уверен, что это возможно. Я быстро создаю нечто похожее, используя один список и два словаря:
List<Dictionary<string, Dictionary<string, string>>> test = new List<Dictionary<string, Dictionary<string, string>>>();
Dictionary<string, Dictionary<string, string>> column1 = new Dictionary<string, Dictionary<string, string>>();
Dictionary<string, Dictionary<string, string>> column2 = new Dictionary<string, Dictionary<string, string>>();
Dictionary<string, string> C1ligne1 = new Dictionary<string, string>();
C1ligne1.Add("value1", "C1ligne1 1");
C1ligne1.Add("value2", "C1ligne1 2");
Dictionary<string, string> C1ligne2 = new Dictionary<string, string>();
C1ligne2.Add("value1", "C1ligne2 1");
C1ligne2.Add("value2", "C1ligne2 2");
Dictionary<string, string> C2ligne1 = new Dictionary<string, string>();
C2ligne1.Add("value1", "C2ligne1 1");
C2ligne1.Add("value2", "C2ligne1 2");
Dictionary<string, string> C2ligne2 = new Dictionary<string, string>();
C2ligne2.Add("value1", "C2ligne2 1");
C2ligne2.Add("value2", "C2ligne2 2");
column1.Add("line1", C1ligne1);
column1.Add("line2", C1ligne2);
column2.Add("line1", C2ligne1);
column2.Add("line2", C2ligne2);
test.Add(column1);
test.Add(column2);
Console.WriteLine(test[0]["line1"]["value1"]); //"C1ligne1 1"
Console.WriteLine(test[0]["line2"]["value2"]); //"C1ligne2 2"
Console.WriteLine(test[1]["line1"]["value2"]); //"C2ligne1 2"
Это работает очень хорошо!
Проблема
Мне удалось сделать то, что я хотел, используя метод и функцию, она работала так, как я хотел:
public void getContent(ref Dictionary<string, List<Object>> content)
{
foreach (XmlNode node in xmlDoc.DocumentElement.ChildNodes)
{
if (!content.ContainsKey(node.Name))
{
content.Add(node.Name, new List<Object>());
content[node.Name].Add(this.nodeContent(node));
}
else
{
content[node.Name].Add(this.nodeContent(node));
}
}
}
private Dictionary<string, List<Object>> nodeContent(XmlNode specificNode)
{
Dictionary<string, List<Object>> content = new Dictionary<string, List<Object>>();
foreach (XmlNode nodeInSpecificNode in specificNode.ChildNodes)
{
if (nodeInSpecificNode.ChildNodes.Count > 1)
{
content.Add(nodeInSpecificNode.Name, new List<object> ());
content[nodeInSpecificNode.Name].Add(this.nodeContent(nodeInSpecificNode));
}
else
{
content.Add(nodeInSpecificNode.Name, new List<Object>());
content[nodeInSpecificNode.Name].Add(nodeInSpecificNode.InnerText);
}
}
return content;
}
К сожалению, это вынуждает меня использовать список Object, поскольку я не могу знать, сколько дочерних узлов будет в каждом узле. Это делает меня неспособным получить доступ к нескольким дочерним узлам, как я показал в первой части, потому что Object - это не List.
Вопрос
Есть ли способ на самом деле решить это?
Я хотя и мог бы преобразовать список объектов в список Dictionary, основываясь на моих потребностях, но я действительно понятия не имею, как он будет работать.