C# xml с несколькими разделами для преобразования словаря - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть файл конфигурации, который выглядит следующим образом:

 <configuration>

  <setings1>

    <a>False</a>
    <c>True</c>

  </setings1>

  <Settings2>
    <b>10</b>
  </Settings2>

</configuration>

Как преобразовать в словарь (строка, список (строка, строка)), т. Е. Настройки в качестве ключа и элементы в качестве вспомогательных значений

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Использование XMl Linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication157
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            Dictionary<string, List<List<string>>> dict = doc.Descendants().Where(x => x.Name.LocalName.ToUpper().StartsWith("SETTINGS"))
                .GroupBy(x => x.Name.LocalName.ToUpper(), y => y.Elements().Select(a => new List<string> { a.Name.LocalName, (string)a }).ToList())
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());
        }
    }
}
1 голос
/ 21 февраля 2020

Вы можете попытаться перечислить дочерние элементы узла Root в качестве элементов настроек, а затем перечислить каждый элемент setting, чтобы получить дочерние значения

var document = XDocument.Parse(xml);

var dict = new Dictionary<string, List<(string key, string value)>>();
foreach (var element in document.Root.Elements())
{
    var list = new List<(string key, string value)>();
    foreach (var child in element.Elements())
    {
        list.Add((child.Name.ToString(), child.Value));
    }
    dict.Add(element.Name.ToString(), list);
}

List<T> в C# не поддерживает два обобщенных параметра типа c, поэтому вы не можете объявить его как List<string,string>.

Вы можете использовать список кортежей, как в примере выше, или создать свой собственный объект для представления ключа и значения или использовать встроенный KeyValuePair<TKey,TValue> класс

...