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

问题描述 投票:0回答:1

我有以下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中子节点的数量来创建多个<options>标签,而不是一个<options>标签。

我正在C#.NET中使用XmlDocument。

最简单的方法是什么?

c# .net xml parent-child xmldocument
1个回答
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);
}
© www.soinside.com 2019 - 2024. All rights reserved.