如何将子节点放入自己的父节点?

Posted

技术标签:

【中文标题】如何将子节点放入自己的父节点?【英文标题】:How do I put child nodes into their own parent node? 【发布时间】:2020-08-28 01:23:30 【问题描述】:

我有以下 XML 输入:

<init>
   <options>
      <option>1</option>
      <option>2</option>
      <option>3</option>
   </options>
</init>

我想将其转换为以下输出 XML:

<init>
    <options>
       <option>1</option>
    </options>
    <options>
       <option>2</option>
    </options>
    <options>
       <option>3</option>
    </options>
</init>

因此,我想根据输入 XML 中子节点的数量创建多个 &lt;options&gt; 标签,而不是一个 &lt;options&gt; 标签。

我在 C# .NET 中使用 XmlDocument。

最简单的方法是什么?

【问题讨论】:

到目前为止你尝试了什么? 【参考方案1】:

假设您提供的格式正是您提供的

var xmlStr = @"<init>
                  <options>
                     <option>1</option>
                     <option>2</option>
                     <option>3</option>
                  </options>
               </init>";
        var xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(xmlStr);

        var resultDoc = new XmlDocument();
        resultDoc.LoadXml("<init></init>");
        XmlElement elem;

        foreach (XmlElement node in xmlDoc.FirstChild.FirstChild.ChildNodes)
        
            elem = resultDoc.CreateElement("options");
            resultDoc.FirstChild.AppendChild(elem);

            elem = resultDoc.CreateElement("option");
            elem.InnerText = node.InnerText;
            resultDoc.FirstChild.LastChild.AppendChild(elem);
        

Console.WriteLine(resultDoc.InnerXml);

编辑: 您可以使用相同的文档并对元素重新排序,而不是创建新的 XmlDocument。我希望这就是你的意思。

xmlDoc.LoadXml(xmlStr);

xmlDoc.FirstChild.InnerXml = string.Join("", 
    xmlDoc.SelectNodes("//option")
    .Cast<XmlNode>()
    .Select(n => n.OuterXml));

XmlElement elem;
foreach (XmlElement node in xmlDoc.SelectNodes("//init//option"))

    xmlDoc.FirstChild.RemoveChild(node);
    elem = xmlDoc.CreateElement("options");
    elem.AppendChild(node);
    xmlDoc.FirstChild.AppendChild(elem);

【讨论】:

太棒了!如果我提供的输入是更大 XML 的一部分怎么办?现在,您正在第二个 XmlDocument 中从头开始构建它。 如果您有较大的 XML 文件,您可以使用相同的文档。选择所有 我基本上需要在每个 不支持在 Xmldocument 中的 NodeList 上进行投射。我对此有点陌生,所以我想弄清楚 你添加了“使用 System.Linq;”在课堂里?您需要参考 System.Linq 才能使其正常工作。

以上是关于如何将子节点放入自己的父节点?的主要内容,如果未能解决你的问题,请参考以下文章

如何将节点放入父节点?

求教二叉树遍历,父节点出错

ztree中怎样获取选中节点的父节点及自己的index

如何访问 Firebase 实时数据库中子节点的父节点?

给定一个中序线程二叉树和一个节点,如何找到该特定节点的父节点?

遍历 YAML::Node 时如何获取当前节点的父节点?