使用“InsertAfter”时无法正确保存对XML文档的更改

时间:2017-08-23 02:26:20

标签: c# xml xmldocument

我基本上是在尝试添加我在现有节点之后创建的节点。在这里,我有一个父节点(Tag)列表和一个子节点列表(Name)。我想添加我在子节点之后创建的节点。 我已逐步完成每次迭代,并且每次迭代都会进行正确的更改,但在进行下一次迭代时,它无法正确保存。

input.xml中

<Tag><Name>NAME 1</Name></Tag>
<Tag><Name>NAME 2</Name></Tag>
<Tag><Name>NAME 3</Name></Tag>

的Output.xml

<Tag><Name>NAME 1</Name></Tag>
<Tag><Name>NAME 2</Name></Tag>
<Tag><Name>NAME 3</Name><Node>Node Inner Text</Node></Tag>

目标

<Tag><Name>NAME 1</Name><Node>Node Inner Text</Node></Tag>
<Tag><Name>NAME 2</Name><Node>Node Inner Text</Node></Tag>
<Tag><Name>NAME 3</Name><Node>Node Inner Text</Node></Tag>

代码

XmlDocument xmlDoc = new XmlDocument(); // Create an XML document object
xmlDoc.Load("test.xml"); // Load the XML document from the specified file

XmlNodeList NameList = xmlDoc.SelectNodes("//Tag/Name");
XmlNodeList TagList = xmlDoc.SelectNodes("//Tag");

//create ---> <Node>Node Inner Text</Node>
XmlNode NodeToAdd = xmlDoc.CreateElement("Node");
NodeToAdd.InnerText = "Node Inner Text";

for (int i = 0; i < TagList.Count; i++)
{
    TagList[i].InsertAfter(NodeToAdd, NameList[i]);
}
xmlDoc.Save("output.xml");

1 个答案:

答案 0 :(得分:0)

原因是您要插入创建的XmlNode的相同实例 因此,InsertAfter方法会将现有节点从之前的<Tag>节点移动到下一个节点。

您可以在内部循环中创建新节点,然后您将获得预期的输出

for (int i = 0; i < TagList.Count; i++)
{
    XmlNode NodeToAdd = xmlDoc.CreateElement("Node");
    NodeToAdd.InnerText = "Node Inner Text";

    TagList[i].InsertAfter(NodeToAdd, NameList[i]);
}

xmlDoc.Save("output.xml");