【问题标题】:How to place every child node from a specific parent node into its own parent node如何将特定父节点中的每个子节点放入其自己的父节点
【发布时间】:2020-05-12 18:53:07
【问题描述】:

我有一个问题。

我有以下 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);
}

但是,这只有在有一个爱好列表时才有效,并且它不会记住它的来源。我有点卡住了,所以如果有人可以帮助我,我会非常感激!

您好!

【问题讨论】:

  • 好吧,看来你想要的输出是从正确的结构倒退了一步。您应该将每组个人数据(来自 ... )放入单独的元素中,例如 &lt;person&gt;,并将 &lt;hoobys&gt; 保留在第一个示例中。
  • 嘿,我想在我自己的应用程序中使用所需的输出,而当我加载 XML 时,它不适用于当前输出。将子节点放在自己的父节点中是解决我的问题的一种方法,问题是如何做到这一点:)
  • 嗯,你应该可以通过使用插入而不是追加来做到这一点(如InsertAfter)。
  • 试过了,但我觉得我处理问题的方式总体上有些问题

标签: c# .net xml linq parent-child


【解决方案1】:

嗯,这是 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

【讨论】:

    猜你喜欢
    • 2020-08-28
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多