Удаление и чтение из файла XML

1

Всякий раз, когда я пытаюсь удалить запись из xml файла с помощью кнопки, она удаляет ее из формы, но она остается в файле xml. Другая проблема, которую я испытываю, заключается в следующем:

Я создаю пользователя в программе, он сохраняет файл xml. Я закрываю программу и загружаю ее в первый раз, когда я загружаю ее обратно после помещения записи там, где она читает правильно, и показывает, что находится в XML файле. Однако, если я закрываю и открываю программу снова и снова, она дублирует записи в XML файле снова и снова при каждом открытии.

Какие-либо предложения?

 public partial class StaffCreate : Form
{
    public StaffCreate()
    {
        InitializeComponent();
    }

    List<Person> people = new List<Person>();
    private void StaffCreate_Load(object sender, EventArgs e)
    {
        string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        if (!Directory.Exists(path + "\\stockbox  Documents"))
            Directory.CreateDirectory(path + "\\stockbox Documents");
        if (!File.Exists(path + "\\stockbox Documents\\People_File.xml"))
        {
            XmlTextWriter xWriter = new XmlTextWriter(path + "\\stockbox Documents\\People_File.xml", Encoding.UTF8);
            xWriter.WriteStartElement("People");
            xWriter.WriteEndElement();
            xWriter.Close();
        }

        XmlDocument xDoc = new XmlDocument();
        xDoc.Load(path + "\\stockbox Documents\\People_File.xml");
        foreach (XmlNode xNode in xDoc.SelectNodes("People/Person"))
        {
            Person p = new Person();
            p.name = xNode.SelectSingleNode("Name").InnerText;
            p.pass = xNode.SelectSingleNode("Password").InnerText;
            p.title = xNode.SelectSingleNode("Title").InnerText;
            people.Add(p);
            listView1.Items.Add(p.name);
        }



    }

    private void button2_Click(object sender, EventArgs e)
    {
        Person p = new Person();
        p.name = nameTxt.Text;
        p.pass = passTxt.Text;
        p.title = titleTxt.Text;
        people.Add(p);
        listView1.Items.Add(p.name);
        nameTxt.Text = "";
        passTxt.Text = "";
        titleTxt.Text = "";
    }

    private void listView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (listView1.SelectedItems.Count > 0)
        {
            nameTxt.Text = people[listView1.SelectedItems[0].Index].name;
            passTxt.Text = people[listView1.SelectedItems[0].Index].pass;
            titleTxt.Text = people[listView1.SelectedItems[0].Index].title;
        }
    }

    private void button3_Click(object sender, EventArgs e)
    {
        remove();
        nameTxt.Text = "";
        passTxt.Text = "";
        titleTxt.Text = "";
    }

    void remove()
    {
        try
        {
            people.RemoveAt(listView1.SelectedItems[0].Index);
            listView1.Items.Remove(listView1.Items[0]);

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        people[listView1.SelectedItems[0].Index].name = nameTxt.Text;
        people[listView1.SelectedItems[0].Index].pass = passTxt.Text;
        people[listView1.SelectedItems[0].Index].title = titleTxt.Text;
        listView1.SelectedItems[0].Text = nameTxt.Text;
    }

    private void StaffCreate_FormClosing(object sender, FormClosingEventArgs e)
    {
        string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        XmlDocument xDocument = new XmlDocument();
        xDocument.Load(path + "\\stockbox Documents\\People_File.xml");
        XmlNode xNode = xDocument.SelectSingleNode("People");

        foreach (Person p in people)
        {

            XmlNode xTnode = xDocument.CreateElement("Person");
            XmlNode xName = xDocument.CreateElement("Name");
            XmlNode xPass = xDocument.CreateElement("Password");
            XmlNode xTitle = xDocument.CreateElement("Title");

            xName.InnerText = p.name;
            xPass.InnerText = p.pass;
            xTitle.InnerText = p.title;

            xTnode.AppendChild(xName);
            xTnode.AppendChild(xPass);
            xTnode.AppendChild(xTitle);
            xDocument.DocumentElement.AppendChild(xTnode);
        }
        xDocument.Save(path + "\\stockbox Documents\\People_File.xml");
    }

}

class Person
{
    public string name
    {
        get;
        set;
    }

    public string pass
    {
        get;
        set;
    }


    public string title
    {
        get;
        set;
    }
}

}

  • 0
    элемент остался в xml, потому что вы не удалили ни одного элемента из xml. причина дублирования: каждый раз, когда вы закрываете форму, FormClosing выполняет и добавляет все узлы.
Теги:

3 ответа

0
Лучший ответ

В StaffCreate_FormClosing вы xDocument существующим содержимым файла (xDocument.Load), а затем добавляете все в памяти в цикле for, которое содержит все, что было в файле, когда оно было загружено (дублирует минус удаленные элементы плюс добавлено Предметы). В результате все, что не было удалено, добавляется дважды. Если у вас есть все в памяти, нет необходимости загружать из файла - вы не хотите ни одного из них.

0

Вы должны либо очищать содержимое файла xml каждый раз, либо отслеживать те nodes которые в ваших кодах, статусах этих персонажей: были ли они созданы в последнее время или загружены из существующего XML файла. Может быть, это немного простая вещь "ORM".

И, возможно, использовать Path.Combine() лучше, чем комбинацию строк пути вручную

0

В вашем методе StaffCreate_FormClosing вы загружаете файл и добавляете новые узлы для всех объектов пользователей, находящихся в настоящее время в памяти. Удаление всех детей из узла пользователя (xnode) перед добавлением должно делать трюк.

  • 0
    Удаление всех дочерних элементов из этого узла дает исключение NullOutofRange, когда вы пытаетесь загрузить программу с пустым файлом. Я удалил людей. Добавьте (p) и поместите загрузчик в событие нажатия кнопки, теперь он будет отображать только сохраненные данные в файле, а не дублировать их.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню