如何将节点附加到xml文件中的特定位置

时间:2016-05-07 18:38:23

标签: c# xml

我有一个这样的XML文件,其中有多个表,我试图在xml文件的特定表的末尾添加一个新节点。用户将选择该表并将其数据输入DataGridView

<?xml version="1.0" encoding="UTF-8"?>
<table name="emloyees">
    <emloyees>
        <emp_num>employee 1</emp_num>
        <department>sales</department>
        <salary>1000</salary>
    </employees>
    <employees>
        <emp_num>employee 2</emp_num>
        <department>IT</department>
        <salary>2000</salary>
    </employees>

    ((for example I want to add new employees node here))

    <table name="projects">
        <projects>
            <proj_num>project 1</proj_num>
            <name>hosbital system</name>
            <num_mempers>5 members</num_mempers>
        </projects>
        <projects>
        <proj_num>project 2</proj_num>
            <name>library system</name>
            <num_mempers>4 members</num_mempers>
        </projects>
   </table>
</table>

我编写了这段代码,但不是插入新节点,而是使用新节点替换表的最后一个节点。我该如何解决这个问题?

private void button4_Click(object sender, EventArgs e)
{
    XmlDocument doc = new XmlDocument();
    doc.Load("Data.xml");
    string tablename = comboBox1.SelectedItem.ToString();
    XmlNodeList row = doc.GetElementsByTagName(tablename);
    int c = row.Count;
    for (int j = 0; j < dataGridView1.Rows.Count - 1; j++)
    {
        XmlNodeList child = row[c - 1].ChildNodes;
        XmlElement element = doc.CreateElement(tablename);
        for (int k = 0; k < child.Count; k++)
        {
            XmlElement node = doc.CreateElement(child[k].ToString());
            child[k].InnerText = dataGridView1.Rows[j].Cells[k].Value.ToString();
            element.AppendChild(node);
        }
        XmlElement root = doc.DocumentElement;
        root.AppendChild(element);
        doc.Save("Data.xml");
    }
    dataGridView1.Rows.Clear();
    MessageBox.Show("Successfully Added !!");
}

1 个答案:

答案 0 :(得分:0)

问题似乎就在这里。

for (int k = 0; k < child.Count; k++)
{
   XmlElement node = doc.CreateElement(child[k].ToString());
   child[k].InnerText = dataGridView1.Rows[j].Cells[k].Value.ToString(); // < here
   element.AppendChild(node);
}

您正在设置child[k]'s内部文字,而不是您创建的node的值。

child[k]更改为node

node.InnerText = dataGridView1.Rows[j].Cells[k].Value.ToString();

您的标题要求将节点放在特定位置,但您的代码没有这样做。您需要使用parentNode.InsertAfter(newNode, refNode)方法。

而不是root.AppendChild(element);。这将节点放在文件的底部,使用root.InsertAfter(element, child[child.Count - 1])将新节点放在您正在设置的最后一个子类型之后。

AppendChild MSDN文档。