Проблема с редактированием файлов XML в C # - PullRequest
1 голос
/ 02 мая 2011

Привет В настоящее время я работаю над программой, которая позволяет пользователю добавлять и редактировать «События» в файлы 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>

Теперь программа позволяет пользователю добавлять и редактировать события, которые затем отображаются с помощью инструмента treeView.

Моя проблема возникает, когда я пытаюсь перезаписать существующий файл 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 # и программировании в целом, и даже после поиска в Google в течение нескольких часов я понятия не имею, что может быть не так. Я надеюсь, что вы можете помочь мне там.

Заранее спасибо

Сифилис

1 Ответ

2 голосов
/ 02 мая 2011

Ни при каких условиях вы не загружаете исходный файл, поэтому вы заменяете полностью, без каких-либо старых данных. Посмотрите на .Load(path). Кроме того, вы не закрыли FileStream, и, честно говоря, просто .Save(path) проще.

...