2011-05-01 42 views
1

嗨 我目前正在開發一個程序,允許用戶添加和編輯「事件」到XML文件。 這些事件是在PC遊戲中使用,並期待這樣的:編輯C#中的XML文件的問題

<Event Name="some_name"> 
    <Event_Type>TYPE</Event_Type> 
    <Event_Param1>parameter1</Event_Param1> 
    <Event_Param2>parameter2</Event_Param2> 
    ... 
    <Reward_Type>TYPE</Reward_Type> 
    <Reward_Param1>parameter1</Reward_Param2> 
    ... 
    <Prereq>Prerequisite</Prereq> 
    <Branch></Branch> 
    <Perpetual>true</Perpetual> 
</Event> 

現在,該程序允許用戶添加和編輯的事件,然後再採用樹形視圖工具顯示。

當我試圖覆蓋現有的XML文件時發生了我的問題。 我已經可以打開一個現有的文件,並且所有的數據都能正確顯示在treeView中。 現在,所有我添加到文件的事件被保存得很好,但是已在文件中存在的事件的所有數據都會丟失,只有這些空標籤仍然存在:

<Event Name="name" /> 

好,這裏是我的代碼:

DialogResult result = saveFileDialog1.ShowDialog(); 
     if (result == DialogResult.OK) 
     { 
      string save = saveFileDialog1.FileName; 



      XmlDocument doc = new XmlDocument(); 
      XmlElement root = doc.CreateElement("Story"); 

      for (int i = 0; i < treeView1.Nodes.Count; i++) 
      { 

       TreeNode subnode = treeView1.Nodes[i]; 


       XmlElement new_event = doc.CreateElement("Event"); 
       XmlAttribute attr = doc.CreateAttribute("Name"); 
       attr.Value = subnode.Text; 
       new_event.Attributes.Append(attr); 

       root.AppendChild(new_event); 

        for (int j = 0; j < subnode.Nodes.Count; j++) 
        { 
         TreeNode type_node = subnode.Nodes[j]; 
         if (type_node.ToolTipText == "Event Type") 
         { 
          XmlElement event_type = doc.CreateElement("Event_Type"); 
          event_type.InnerText = type_node.Text; 
          new_event.AppendChild(event_type); 

          if (type_node.Nodes.Count > 0) 
          { 
           for (int k = 0; k < type_node.Nodes.Count; k++) 
           { 
            TreeNode param_node = type_node.Nodes[k]; 

            XmlElement param = doc.CreateElement("Event_Param" + (k + 1)); 
            param.InnerText = param_node.Text; 

            new_event.AppendChild(param); 
           } 

          } 

         } 

         else if (type_node.ToolTipText == "Reward Type") 
         { 
          XmlElement reward_type = doc.CreateElement("Reward_Type"); 
          reward_type.InnerText = type_node.Text; 
          new_event.AppendChild(reward_type); 

          if (type_node.Nodes.Count > 0) 
          { 
           for (int k = 0; k < type_node.Nodes.Count; k++) 
           { 
            TreeNode param_node = type_node.Nodes[k]; 

            XmlElement param = doc.CreateElement("Reward_Param" + (k + 1)); 
            param.InnerText = param_node.Text; 

            new_event.AppendChild(param); 
           } 

          } 

         } 

         else if (type_node.ToolTipText == "Prereq") 
         { 
          XmlElement prereq = doc.CreateElement("Prereq"); 
          prereq.InnerText = type_node.Text; 
          new_event.AppendChild(prereq); 
         } 

         else if (type_node.ToolTipText == "Branch") 
         { 
          XmlElement branch = doc.CreateElement("Branch"); 
          branch.InnerText = type_node.Text; 
          new_event.AppendChild(branch); 

         } 

         else if (type_node.ToolTipText == "Perpetual") 
         { 
          XmlElement perpetual = doc.CreateElement("Perpetual"); 
          perpetual.InnerText = type_node.Text; 
          new_event.AppendChild(perpetual); 
         } 



        }        
      } 
      doc.AppendChild(root); 
      FileStream fs = new FileStream(save, FileMode.Truncate, FileAccess.Write, FileShare.ReadWrite); 
      doc.Save(fs); 

我是很新的C#和編程一般,甚至幾個小時,我不知道什麼可能是錯誤的谷歌搜索後。我希望你能幫助我。

在此先感謝

回答

2

在任何時候你加載原始文件,所以你更換它完全沒有任何舊的數據。看看.Load(path)。另外,你還沒有關閉FileStream,說實話只是.Save(path)比較容易。

+0

啊,我忘了提及我已經在openfileDialog的幫助下打開了該文件之前,原始文件的所有內容都正確顯示在treeView中。保存文件的代碼僅基於來自treeView的數據,所以這就是爲什麼我想知道它不起作用,因爲我說的一切都在那裏。無論如何,感謝您的快速回應:) – Pox 2011-05-01 23:28:38