public static string deconstructXML_WordIndexer(string s, bool dax = false) { var xDoc = XDocument.Parse(s); var indexes = xDoc.Descendants("fields").Attributes("numOfWords").FirstOrDefault().Value; var elements = xDoc.Descendants("fields").Attributes("numOfElements").FirstOrDefault().Value; int t = 0; int.TryParse(indexes, out t); string[] val = new string[t]; foreach (XElement xe in xDoc.Descendants("word")) { string index = xe.Attribute("value").Value; string value = xe.Value; if (dax == true) { string[] il = xe.Value.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); foreach (string ils in il) { int ilsIndex = (int)Dax.ConvertDaxToNumber(ils); val[ilsIndex] = index; } } else { string[] il = xe.Value.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); foreach (string ils in il) { int tp = 0; int.TryParse(ils, out tp); val[tp] = index; } } } List <char> letters = string.Join("", val.Select(x => x.ToString())).ToList(); int numElements = 0; int.TryParse(elements.ToString(), out numElements); List <char> words = new List <char>(); words.AddRange(Enumerable.Repeat((char)0, numElements)); foreach (XElement xe in xDoc.Descendants("field")) { string index = xe.Attribute("value").Value; string value = xe.Value; string[] il = xe.Value.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); int ti = 0; int.TryParse(index, out ti); char c = Convert.ToChar(ti); foreach (string ils in il) { int tp = 0; int.TryParse(ils, out tp); words[tp] = c; } } int indexLetters = 0; for (int indexWords = 0; indexWords < words.Count; indexWords++) { if (words[indexWords] == (char)0) { words[indexWords] = letters[indexLetters]; indexLetters++; } } return(string.Join("", words.Select(x => x.ToString()))); }