如何使用C#将子节点添加到XML文件中的根元素

时间:2010-06-30 10:14:43

标签: c# xml

xml文件具有以下结构

<RootElement>
</RootElement>

我需要将“Child”元素附加到RootElement和TestChild。 为此,我使用以下代码。

         List<string> Str = new List<string> {"a","b"};
        XmlDocument XDOC = new XmlDocument();
        XDOC.Load(Application.StartupPath + "\\Sample.xml");
        XmlNode RootNode = XDOC.SelectSingleNode("//RootElement");
        XmlNode TestChild = XDOC.CreateNode(XmlNodeType.Element, "TestChild", null);
        for (int Index = 0; Index < Str.Count; Index++)
        {
            XmlElement XEle = XDOC.CreateElement("Child");
            XEle.SetAttribute("Name", Str[Index]);
            TestChild.AppendChild(XEle);
            RootNode.AppendChild(XEle);
        }
        RootNode.AppendChild(TestChild);
        XDOC.Save(Application.StartupPath + "\\Sample.xml");

但是有了这个,我可以将子节点仅附加到RootElement

结果应该是

    <RootElement>
    <Child Name="a"/>
    <Child Name="b"/>
    <TestChild>
        <Child Name="a"/>
        <Child Name="b"/>
    </TestChild>
</RootElement>

但现在我变得像

    <RootElement>  
        <Child Name="a" />
        <Child Name="b" />
        <TestChild>
        </TestChild>
     </RootElement>

请给我一个解决方案来做到这一点

提前致谢

3 个答案:

答案 0 :(得分:3)

我认为问题即将来临,因为你在root和test中都使用相同的节点元素,所以创建克隆而不是添加它

XmlElement XEle = XDOC.CreateElement("Child");
XEle.SetAttribute("Name", Str[Index]);
TestChild.AppendChild(XEle);
RootNode.AppendChild(XEle.Clone());

答案 1 :(得分:2)

试试这个:

            XmlElement cpyXEle = XEle.Clone() as XmlElement;
            TestChild.AppendChild(XEle);
            RootNode.AppendChild(cpyXELe);

答案 2 :(得分:0)

正如其他人所说,你需要克隆节点。如果不清楚的原因是该节点只能出现在dom树中的一个位置。最初你把它放在孩子身上,然后当你把它放在根上时,它将它从孩子移到根。如果你想一想当你问它当前的父母是什么时会告诉你什么,这是有道理的 - 它只能给出一个答案......