如何将特定父节点中的每个子节点放置到其自己的父节点中



我有一个问题。

我有以下 XML 输入:

<root>
<name>Dennis</name>
<lastname>Some Lastname</lastname>
<age>28</age>
<hobbys>
<hobby>test1</hobby>
<hobby>test2</hobbyy>
<hobby>test3</hobby>
</hobbys>
<food>pizza</food>
<name>Bob</name>
<lastname>Some Lastname</lastname>
<age>48</age>
<hobbys>
<hobby>test4</hobby>
<hobby>test5</hobbyy>
<hobby>test6</hobby>
<hobby>test7</hobby>
<hobby>test8</hobby>
</hobbys>
<food>fries</food>
<footerText>blablabla</footerText>
</root>

并希望将特定节点的每个子节点放入其自己的父节点中(在这种情况下,我希望为所有子节点提供一个父节点,因此所需的输出将是:

<root>
<name>Dennis</name>
<lastname>Some Lastname</lastname>
<age>28</age>
<hobbys>
<hobby>test1</hobby>
</hobbys>
<hobbys>
<hobby>test2</hobby>
</hobbys>
<hobbys>
<hobby>test3</hobby>
</hobbys>
<food>pizza</food>
<name>Bob</name>
<lastname>Some Lastname</lastname>
<age>48</age>
<hobbys>
<hobby>test4</hobby>
</hobbys>
<hobbys>
<hobby>test5</hobby>
</hobbys>
<hobbys>
<hobby>test6</hobby>
</hobbys>
<hobbys>
<hobby>test7</hobby>
</hobbys>
<hobbys>
<hobby>test8</hobby>
</hobbys>
<food>fries</food>
<footerText>blablabla</footerText>
</root>

获得所需结果的最简单方法是什么? 我尝试了以下方法:

var xmlStr = [XML STRING];
xmlDoc.LoadXml(xmlStr);
xmlDoc.FirstChild.InnerXml = string.Join("", 
xmlDoc.SelectNodes("//hobby")
.Cast<XmlNode>()
.Select(n => n.OuterXml));
XmlElement elem;
foreach (XmlElement node in xmlDoc.SelectNodes("//root//hobby"))
{
xmlDoc.FirstChild.RemoveChild(node);
elem = xmlDoc.CreateElement("hobbys");
elem.AppendChild(node);
xmlDoc.FirstChild.AppendChild(elem);
}

然而,这只有在有一个爱好列表时才有效,并且它不会记住它来自哪里。我有点卡住了,所以如果有人能帮助我,我将不胜感激!

问候!

嗯,这是XML的一个有趣的用法(XML最重要的优点之一是具有正确的父/子数据表示(,但你可以像这样解决它:

var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(currentXML);
foreach (var currHobbysNode in xmlDoc.SelectNodes("//hobbys").Cast<XmlNode>())
{
foreach (var currHobbyNode in currHobbysNode.ChildNodes.Cast<XmlNode>())
{
//Create a new node.
var newHobbysElement = xmlDoc.CreateElement("hobbys");
var newHobbyElement = xmlDoc.CreateElement("hobby");
newHobbyElement.InnerText = currHobbyNode.InnerText;
newHobbysElement.AppendChild(newHobbyElement);
currHobbysNode.ParentNode.InsertBefore(newHobbysElement, currHobbysNode);
}
currHobbysNode.ParentNode.RemoveChild(currHobbysNode);
}

这似乎很明显,但这里发生的事情是我们为每个"爱好"节点循环并获取子节点,然后为每个"爱好"孩子创建新的"爱好"节点。 这是一个示例小提琴 https://dotnetfiddle.net/GSd86D

最新更新