CSharp · Console
using System;
using System.Xml;
public class Program
{
public static void Main()
{
string xml = @"<xml>
<Test1>
<Test1-Sub1>
Testing 1 sub 1
</Test1-Sub1>
<Test1-Sub2>
<Test1-Sub2-SubPart1>
Testing Sub2-SubPart1
</Test1-Sub2-SubPart1>
</Test1-Sub2>
</Test1>
<Test2>
<Test2-Sub1>
<Test2-Sub1-SubPart1>
Testing Sub1-SubPart1
</Test2-Sub1-SubPart1>
</Test2-Sub1>
</Test2>
</xml>";
var builder = new XmlHierarchicalTextBuilder(xml);
Console.WriteLine(builder.Build());
}
public class XmlHierarchicalTextBuilder
{
private XmlDocument xmlDoc;
private string hierarchicalText;
private int indentlevel = 0;
private const string NEW_LINE = "\n";
private const string TAB = "\t";
private const string PIPE = "|";
private const string SPACE = " ";
public XmlHierarchicalTextBuilder (string xml)
{
xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
}
public string Build()
{
Build(xmlDoc.DocumentElement);
return hierarchicalText;
}
private void Build(XmlElement xmlElement)
{
if (xmlElement.HasChildNodes)
{
HandleXmlElementName(xmlElement);
foreach (XmlNode item in xmlElement.ChildNodes)
{
indentlevel++;
if (item.NodeType == XmlNodeType.Text)
{
HandleXmlElementInnerText(xmlElement);
}
else if (item.NodeType == XmlNodeType.Element)
{
Build((XmlElement)item);
}
//add more conditions based on different xml node types in future, if u want
indentlevel--;
}
}
}
private void HandleXmlElementInnerText(XmlElement xmlElement)
{
addIndent();
hierarchicalText += PIPE + SPACE + xmlElement.InnerText.Trim();
addNewLine();
}
private void HandleXmlElementName(XmlElement xmlElement)
{
addIndent();
hierarchicalText += xmlElement.Name;
addNewLine();
}
private void addIndent()
{
for (int i = 0; i < indentlevel; i++)
{
hierarchicalText += TAB;
}
}
private void addNewLine()
{
hierarchicalText += NEW_LINE;
}
}
}