How to load the following XML using LINQ-to-XML into a dictionary?

How to download the following XML document format:

<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> 

In the dictionary, where the key is a separate extension and the value is a mimetype type.

So for this line:

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

I would have the following key values:

Key: ".xla" Value: "application / vnd.ms-excel"
Key: ".xlc" Value: "application / vnd.ms-excel"
Key: ".xlm" Value: "application / vnd.ms-excel"
Key: ".xls" Value: "application / vnd.ms-excel"
Key: ".xlt" Value: "application / vnd.ms-excel"

I am relatively new to the LINQ-To-XML business.

I know that I have to load the document in XElement, for example:

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

However, how do I select all the "MimeType" entries?

+3
source share
3 answers

Sort of:

  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); 
+5
source

This is my decision.

  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); } } 

Ok, looking at the Jonh code ... here is my second solution :)

 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); 
0
source

Here is my contribution.

  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
source

Source: https://habr.com/ru/post/1309624/


All Articles