Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将子节点放入它们自己的父节点中?_C#_.net_Xml_Parent Child_Xmldocument - Fatal编程技术网

C# 如何将子节点放入它们自己的父节点中?

C# 如何将子节点放入它们自己的父节点中?,c#,.net,xml,parent-child,xmldocument,C#,.net,Xml,Parent Child,Xmldocument,我有以下XML输入: <init> <options> <option>1</option> <option>2</option> <option>3</option> </options> </init> 我想将其转换为以下输出XML: <init> <options> <o

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

我正在C.NET中使用XmlDocument


最简单的方法是什么?

假设格式完全符合您提供的格式

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文件,您可以使用相同的文档。选择所有元素,删除元素并开始附加到同一文档。例如,var child=xmlDoc.SelectNodes//option;xmlDoc.FirstChild.RemoveChildxmlDoc.FirstChild.FirstChild;我基本上需要在每个元素周围都有一个父元素。我对你最后的评论没有进一步的了解,Xmldocument中的节点列表不支持强制转换。我对这个有点陌生,所以我试图弄清楚你是否使用System.Linq;在课堂上?您需要引用System.Linq以使其正常工作。