Как я могу загрузить следующий XML с использованием LINQ-to-XML в словарь? - PullRequest
3 голосов
/ 06 января 2010

Как загрузить следующий форматированный XML-документ:

<Settings>
    <MimeTypes>
        <MimeType Type="application/mac-binhex40" Extensions=".hqx"/>
        <MimeType Type="application/msword" Extensions=".doc;.docx"/>
        <MimeType Type="application/pdf" Extensions=".pdf"/>
        <MimeType Type="application/vnd.ms-excel" Extensions=".xla;.xlc;.xlm;.xls;.xlt;.xlw;.xlsx"/>
    </MimeTypes> 
</Settings>

В словарь, где ключом является индивидуальное расширение, а значением является mimetype.

Итак, для этой строки:

<MimeType Type="application/vnd.ms-excel" Extensions=".xla;.xlc;.xlm;.xls;.xlt;.xlw;.xlsx"/>

У меня были бы следующие записи значения ключа:

Ключ: ".xla" Значение: "application / vnd.ms-excel"
Ключ: ".xlc" Значение: "application / vnd.ms-excel"
Ключ: ".xlm" Значение: "application / vnd.ms-excel"
Ключ: ".xls" Значение: "application / vnd.ms-excel"
Ключ: ".xlt" Значение: "application / vnd.ms-excel"

Я относительно новичок в бизнесе LINQ-To-XML.

Я знаю, что я должен загрузить документ в XElement, например:

 XElement settingsDoc = XElement.Load("Settings.xml");

Однако, как мне выбрать все записи "MimeType"?

Ответы [ 3 ]

5 голосов
/ 06 января 2010

Что-то вроде:

 var dictionary = (from element in settingsDoc.Descendants("MimeType")
                   from extension in element.Attribute("Extensions")
                                         .Value.Split(';')
                   select new { Type = element.Attribute("Type").Value,
                                Extension = extension })
                   .ToDictionary(x => x.Extension,
                                 x => x.Type);
0 голосов
/ 06 января 2010

Вот мой вклад.

        Dictionary<string, string> dic = new Dictionary<string,string>();
        foreach (XElement element in settingsDoc.Descendants("MimeType"))
        {
            string val = element.Attribute("Type").Value;
            foreach (string str in element.Attribute("Extensions").Value.Split(';'))
                if (!dic.ContainsKey(str)) dic.Add(str, val);
        }
0 голосов
/ 06 января 2010

Это мое решение.

 XElement el = XElement.Parse(txt);
            var mimeTypes = el.Element("MimeTypes").Elements("MimeType");
            var transFormed = mimeTypes.Select(x =>
                    new
                    {
                        Type = x.Attribute("Type").Value,
                        Extensions = x.Attribute("Extensions").Value.Split(';')
                    }
                       );
            Dictionary<string, string> mimeDict = new Dictionary<string, string>();
            foreach (var mimeType in transFormed)
            {
                foreach (string ext in mimeType.Extensions)
                {
                    if (mimeDict.ContainsKey(ext))
                        mimeDict[ext] = mimeType.Type;
                    else
                        mimeDict.Add(ext, mimeType.Type);
                }
            }

Хорошо, после просмотра кода Джона ... вот мое второе решение

XElement el = XElement.Parse(txt);
var mimeTypes = el.Element("MimeTypes").Elements("MimeType");
var dictionary = mimeTypes.SelectMany(x => x.Attribute("Extensions").Value.Split(';').Select(
                                               ext => new
                                                {
                                                    Key = ext,
                                                    Value = x.Attribute("Type").Value
                                                 }
                                              )
                                     ).ToDictionary( x => x.Key, y => y.Value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...