【问题标题】:XMLWriter add to existing fileXMLWriter 添加到现有文件
【发布时间】:2023-04-02 06:08:01
【问题描述】:

下面是代码。我的问题是,如果我想创建此文件,然后稍后使用XmlWriter 重新打开它并向当前文件添加更多内容,该怎么做?喜欢进入并使用XmlWriter编辑这个xml

using System.Xml;

class Program
{
    class Employee
    {
        int _id;
        string _firstName;
        string _lastName;
        int _salary;

        public Employee(int id, string firstName, string lastName, int salary)
        {
            this._id = id;
            this._firstName = firstName;
            this._lastName = lastName;
            this._salary = salary;
        }

        public int Id { get { return _id; } }
        public string FirstName { get { return _firstName; } }
        public string LastName { get { return _lastName; } }
        public int Salary { get { return _salary; } }
    }

    static void Main()
    {
        Employee[] employees = new Employee[4];
        employees[0] = new Employee(1, "David", "Smith", 10000);
        employees[1] = new Employee(3, "Mark", "Drinkwater", 30000);
        employees[2] = new Employee(4, "Norah", "Miller", 20000);
        employees[3] = new Employee(12, "Cecil", "Walker", 120000);

        using (XmlWriter writer = XmlWriter.Create("employees.xml"))
        {
            writer.WriteStartDocument();
            writer.WriteStartElement("Employees");

            foreach (Employee employee in employees)
            {
                writer.WriteStartElement("Employee");

                writer.WriteElementString("ID", employee.Id.ToString());
                writer.WriteElementString("FirstName", employee.FirstName);
                writer.WriteElementString("LastName", employee.LastName);
                writer.WriteElementString("Salary", employee.Salary.ToString());

                writer.WriteEndElement();
            }

            writer.WriteEndElement();
            writer.WriteEndDocument();
        }
    }
}

【问题讨论】:

  • 最好的办法是读入文件,将其反序列化给员工,对对象进行更改,然后覆盖文件。这引出了一个问题——你为什么不使用原生 XML 序列化?
  • 就像@stuartd 说的:反序列化——改变你的对象——序列化。由于您使用 int 和 string 等默认类型,您可能会查看 XmlSerializer 以(反)序列化您的“员工”。所以你不需要自己做(反)序列化。这可能会帮助您进入:stackoverflow.com/questions/12924221/…

标签: c# xml


【解决方案1】:

我会重构Employee 类并创建一个Employees 类进行序列化,如下所示:

[XmlRoot("Employees")]
public class Employees : List<Employee> { }

public class Employee
{
    int _id;
    string _firstName;
    string _lastName;
    int _salary;

    public Employee() { }

    public Employee(int id, string firstName, string lastName, int salary)
    {
        this._id = id;
        this._firstName = firstName;
        this._lastName = lastName;
        this._salary = salary;
    }

    [XmlElement("ID")]
    public int Id
    {
        get { return _id; }
        set { _id = value; }
    }
    public string FirstName
    {
        get { return _firstName; }
        set { _firstName = value; }
    }
    public string LastName
    {
        get { return _lastName; }
        set { _lastName = value; }
    }
    public int Salary
    {
        get { return _salary; }
        set { _salary = value; }
    }
}

现在你可以轻松地做你想做的事了:

Employees employees = new Employees();
employees.Add(new Employee(1, "David", "Smith", 10000));
employees.Add(new Employee(3, "Mark", "Drinkwater", 30000));
employees.Add(new Employee(4, "Norah", "Miller", 20000));
employees.Add(new Employee(12, "Cecil", "Walker", 120000));

XmlSerializer ser = new XmlSerializer(typeof(Employees));


ser.Serialize(Console.OpenStandardOutput(), employees);

Console.ReadKey();

然后把它找回来

XmlSerializer ser = new XmlSerializer(typeof(Employees));
Employees emps = (Employees)ser.Deserialize(File.OpenRead("employees.xml"));
emps.Add(new Employeee...);
ser.Serialize(File.OpenWrite("employees.xml"), emps);

随着对象的增长,用新属性装饰成员比重写涉及的XmlReader/XmlWriter 代码要容易得多。

【讨论】:

    猜你喜欢
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多