2016-05-07 20 views
1

XMLファイルが複数あり、複数のテーブルがあり、xmlファイルの特定のテーブルの最後に新しいノードを追加しようとしています。ユーザーはテーブルを選択し、データをDataGridViewに入力します。xmlファイル内の特定の場所にノードを追加する方法

<?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 !!"); 
} 
+0

XML構造が正しいですか? '

'の中の
'? –

答えて

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.InnerText = dataGridView1.Rows[j].Cells[k].Value.ToString(); 

nodeへのあなたのタイトルは、特定の場所でノードを配置することが求められますが、あなたのコードがそれをやっていません。 parentNode.InsertAfter(newNode, refNode)メソッドを使用する必要があります。

だから、root.AppendChild(element);の代わりに。ノードの最後にはroot.InsertAfter(element, child[child.Count - 1])を使用して、最後に設定した子タイプの後に新しいノードを配置します。

AppendChild MSDNドキュメント。

+0

あなたの答えに感謝しましたが、ノードは

と子ノードタグ .... @Churk Savage –

+0

@SaraAshrafええ、そうです。これは 'k'が' for'ループ変数であるからです。そして、 'for'ループの外側で' k'を使用しようとしていました。これはおそらく 'child [child.Count-1]' –

関連する問題