public static void Main(string[] args)
string[] lines = new string[] {
"root_node1_node2_node3=value",
"root_node1_node2_node3=value",
"root_node1_node2_node3_node4=value",
XDocument xDoc = new XDocument();
for (int i = 0; i < lines.Length; i++)
string[] nodes = lines[i].Split('_');
for (int j = 0; j < nodes.Length; j++)
var root = new XElement(nodes[j]);
var previousNode = xDoc.Descendants(nodes[j - 1]).FirstOrDefault();
if (nodes[j].Contains('='))
var elementValues = nodes[j].Split('=');
if (previousNode.DescendantNodes().Count() == 1 && previousNode.Value != "")
previousNode.AddAfterSelf(new XElement(nodes[j - 1], new XElement(elementValues[0], elementValues[1])));
previousNode.Add(new XElement(elementValues[0], elementValues[1]));
var node = xDoc.Descendants(nodes[j]);
previousNode.Add(new XElement(nodes[j]));