/// <summary> /// Formats a single element /// </summary> /// <param name="xe"></param> /// <param name="level"></param> /// <returns></returns> public String FormatSingleXmlElement(XElement xe, Int32 level = 0) { String result = ""; String elementValue = ""; String tagName = xe.Name.ToString(); if (!xe.IsEmpty) { elementValue = xe.Value; if (!elementValue.IsValueEmpty()) { if ("CC_SWIPE" == tagName.ToUpper()) { { Int32 cardLength = elementValue.Length; String mask = new String('X', cardLength - 4); String maskedCardNumber = String.Format("{0}{1}", mask, elementValue.Substring(cardLength - 4)); result = "".PadRight(level) + (tagName + ":").PadRight(15) + maskedCardNumber; } } else { if (200 < elementValue.Length) elementValue = elementValue.Left(200) + "..."; result = "".PadRight(level) + (tagName + ":").PadRight(15) + elementValue; } } } return result; } /// <summary> /// Based on the element either processes the current element or use recursion /// </summary> /// <param name="element"></param> /// <param name="level"></param> /// <returns></returns> public String XmlToString(XElement element, Int32 level = 0) { StringBuilder output = new StringBuilder(); String tagName = element.Name.ToString(); String result = ""; if (element.HasElements) { output.AppendLine("".PadRight(level) + (tagName + ":").PadRight(15)); foreach (XNode xn in element.Nodes()) { result = XmlToString((XElement)xn, level + 1); if (!String.IsNullOrWhiteSpace(result)) output.AppendLine(result); } } else { return FormatSingleXmlElement(element, level); } return output.ToString(); } /// <summary> /// Formats XML into a string /// </summary> /// <param name="input"></param> /// <param name="level"></param> /// <returns></returns> public String XmlDisplay(String input, Int32 level = 0) { try { if (0 == level) { String rootNode = "DummyNode"; input = String.Format("<{0}>{1}</{0}>", rootNode, input); } if (level > 5) return ""; // don't create infinite loop XElement elements = XElement.Parse(input); StringBuilder output = new StringBuilder(); foreach (XElement xe in elements.Elements()) { output.Append(XmlToString(xe, level)); } return output.ToString(); } catch (Exception ex) { String error = ex.Message.ToString(); Logging.Log(error, 1); return String.Format("<ERR>0</ERR><STATUSCODE>100</STATUSCODE><MSG>{0}</MSG>", error); } } }My problem (I think) now is that I do not get the empty string after first tag (Changed) that has empty element. At least my test is still failing although I am now getting very close to the desired output.