Это довольно просто, когда вы понимаете, как играть с XDocument, XElement.Я только что создал List<XElement>
, чтобы собрать все дочерние элементы, а затем просто добавлю их к новому родителю и назначу родительский элемент для корня.
Я бы настоятельно рекомендовал создать новый документчем обновление существующего.
Решение 1: Подробная версия, чтобы понять, как она работает.
XDocument xDoc = XDocument.Parse(str);
List<XElement> allChildNodes = new List<XElement>();
foreach (var parent in xDoc.Root.Elements("Parent"))
{
allChildNodes.AddRange(parent.Descendants());
}
XElement xParent = new XElement("Parent");
xParent.Add(allChildNodes);
xDoc.Root.Descendants().Remove();
xDoc.Root.Add(xParent);
Решение 2: Спасибо Джеффу Меркадо, у нас есть компактная версия.
XDocument xDoc = XDocument.Parse(str);
xDoc.Root.ReplaceNodes(
new XElement("Parent", // New parent element is created
xDoc.Root.Elements("Parent").Elements()));
Вывод:
<root>
<Parent>
<ChildType1>contentA</ChildType1>
<ChildType2>contentB</ChildType2>
<ChildType3>contentC</ChildType3>
<ChildType1>contentD</ChildType1>
<ChildType3>contentE</ChildType3>
</Parent>
</root>