OK; это зависит от того, какой вывод вы хотите - с XElement вам потребуется немного поработать, чтобы удалить все дочерние узлы и т. д. Однако с XmlDocument все довольно просто:
string xml = @"<xml><nodeA><nodeA1/><nodeA2/></nodeA><NodeB/></xml>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
XmlDocument clone = new XmlDocument();
XmlElement root = (XmlElement) clone.AppendChild(clone.CreateElement("xml"));
foreach(XmlElement el in doc.SelectNodes("//*")) {
root.AppendChild(clone.ImportNode(el, false));
}
Console.WriteLine(clone.OuterXml);
Выходы:
<xml><xml /><nodeA /><nodeA1 /><nodeA2 /><NodeB /></xml>
[был]
Хотите определить «сплющить» в этом контексте? то есть "до" и "после"?
В XDocument есть Descendants () и DescendantNodes (), которые могут выполнять эту работу ...