【问题标题】:Appending data to existing xml file将数据附加到现有的 xml 文件
【发布时间】:2012-08-16 21:25:40
【问题描述】:

我不想覆盖 XML 文件中的数据我想将新旧数据保存在 XML 文件中。

我有三个班:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }       

    public Person()
    {
    }

    public override string ToString()
    {
        return FirstName + " " +LastName + "\t" +Email;
    }
}

public class Student : Person
{
    public Student()
    {
    }
    public double AssessmentGrade { get; set; }
    public double AssignmentGrade { get; set; }

    public override string ToString()
    {
        return base.ToString() + "," +AssessmentGrade + "," + AssignmentGrade;
    }
}

public class Teacher : Person
{
    public int RoomNumber { get; set; }

    public override string ToString()
    {
        return base.ToString() + "," + RoomNumber;
    }
}

我还有一门课,我只是从 PeronDB(类)中调用数据

public class Persons
{
    private List<Person> persons = null;

      public void Save()
    {
        PersonDB.SavePersons(persons);
    }
 }

我正在做的 InPersonDB 类将整个数据保存在 XML 文件中,但它会覆盖

public class PersonDB
{
    private const string path = @"..\..\Persons.xml";


    public static void SavePersons(List<Person> Persons)
    {
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;
        settings.IndentChars = ("   ");

        XmlWriter xmlOut = XmlWriter.Create(path, settings);

        xmlOut.WriteStartDocument();
        xmlOut.WriteStartElement("Persons");

        foreach (Person person in Persons)
        {

                if (typeof(Student).IsInstanceOfType(person))
                {
                    AppendStudentInfo(person, xmlOut);
                }
                else if (typeof(Teacher).IsInstanceOfType(person))
                {
                    AppendTeacherInfo(person, xmlOut);
                }
                else
                {
                    AppendPersonInfo(person, xmlOut);
                }
        }

        xmlOut.WriteEndElement();
        xmlOut.Close();
    }

在我正在做的 Form_Load 事件中:

    Persons personList = null;

    private void FillPersonlstBox()
    {
        Person p;
        listBox1.Items.Clear();
        for (int i = 0; i < personList.Count; i++)
        {
            p = personList[i];
            listBox1.Items.Add(p.ToString());
        }
    }

    private void Save_Click(object sender, EventArgs e)
    {
        HandleChange(personList);
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        personList.Changed += new Persons.ChangeHandler(HandleChange);
    }

    private void HandleChange(Persons Persons)
    {
        Persons.Save();
        FillPersonlstBox();
    }

    private void Load_Click(object sender, EventArgs e)
    {
        personList.Changed += new Persons.ChangeHandler(HandleChange);
        personList.Fill();
        FillPersonlstBox();
    }

当我点击保存按钮时,它会覆盖删除旧数据并保存新数据的数据,即使我按下第一个加载按钮并加载数据,然后添加更多数据,我仍然保存按下按钮覆盖..

【问题讨论】:

  • 你能把你的示例代码减少到 7-10 行吗?它看起来不像事件处理和其他与表单相关的代码属于问题。
  • 那么 PersonDB.GetPerson 代码在哪里?你怎么知道发生了什么变化?看到您只是从 Persons 集合中重新创建 xml,它当然会被覆盖。所以真正的问题是你最初加载的数据到底去了哪里?哦,选角是怎么回事?你的每个类都应该有 read 和 writeto xml 方法,然后如果你打算这样做的话,就会被多态地调用。
  • 你能简单告诉我吗..我真的需要帮助

标签: c# xml


【解决方案1】:

您在 PersonDB 中的常量中有文件路径。而是将文件路径作为参数传递给 Save() 和 SavePersons()。这样,您可以提示用户输入文件名并将其传入或让方法根据约定生成名称。

编辑:

这是一个更改 SavePersons 的签名以包含路径作为参数的示例。

public static void SavePersons(List<Person> Persons, String path)
{
//your code
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多