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

How to place every child node from a specific parent node into its own parent node

我有一个问题。

我有以下 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 最重要的优点之一是可以正确地 parent/child 呈现数据),但您可以这样解决:

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);
        }

这似乎很明显,但这里发生的是我们循环每个 'hobbys' 节点并获取子节点,然后为每个 'hobby' 子节点创建新的 'hobbys' 节点。这是一个示例 fiddle https://dotnetfiddle.net/GSd86D