C# XML序列化而不重写

C# XML序列化而不重写,c#,xml,C#,Xml,如何将数据序列化为xml而不覆盖以前的数据? 在这段代码中,我可以创建XML文件,但当我再次运行此代码时,我会覆盖以前保存的内容: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Xml.Serialization; namespace ActorGen

如何将数据序列化为xml而不覆盖以前的数据? 在这段代码中,我可以创建XML文件,但当我再次运行此代码时,我会覆盖以前保存的内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml.Serialization;

namespace ActorGenerator
{
   class Program
   {
      static void Main()
      {                  
        Console.Write("How many actors you want to add? ");
        int max = 0;
        max = int.Parse(Console.ReadLine());

        for (int i = 0; i < max; i++)
        {
            int x = i + 1;
            Console.WriteLine("////////////////////////ACTOR" + x + "/////////////////////////////////");


            Actor actor1 = new Actor();
            Console.Write("NAME (string): ");  actor1.Name = Console.ReadLine();
            Console.Write("AGE (int): "); actor1.Age = int.Parse(Console.ReadLine());
            Console.Write("FOCUS (string): "); actor1.Focus = Console.ReadLine();
            Console.Write("PRICE (int): "); actor1.Price = int.Parse(Console.ReadLine());
            Console.Write("CONTRACTED (true/false): "); actor1.Contracted = bool.Parse(Console.ReadLine());
            Console.Write("PLAYING IN FILM (true/false): "); actor1.PlayingInFilm = bool.Parse(Console.ReadLine());
            Console.Write("SKILL (int): "); actor1.Skill = int.Parse(Console.ReadLine());


            SerializeToXML(actor1);
        }
    }

    static public void SerializeToXML(Actor actor)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Actor));
        TextWriter textWriter = new StreamWriter(@"c:\users\Desktop\actor.xml");
        serializer.Serialize(textWriter, actor);
        textWriter.Close();
    }
}

public class Actor
 {
    public string Name { get; set; }
    public int Age { get; set; }
    public string Focus { get; set; }
    public int Price { get; set; }
    public bool Contracted { get; set; }
    public bool PlayingInFilm { get; set; }
    public int Skill { get; set; }
 }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.IO;
使用System.Xml.Serialization;
命名空间ActorGenerator
{
班级计划
{
静态void Main()
{                  
Console.Write(“您要添加多少参与者?”);
int max=0;
max=int.Parse(Console.ReadLine());
对于(int i=0;i

另外,如何读取XML数据并将其存储到变量中?

听起来您应该创建一个
列表
-然后您可以从一个条目列表开始,序列化该列表,然后下一次反序列化该列表,添加一个参与者,然后再次序列化,以便在下一次列表中有两个条目,等等。

听起来你应该创建一个
列表
-然后你可以从一个条目的列表开始,序列化该列表,然后下一次反序列化该列表,添加一个参与者,然后再次序列化,以便在下一次列表中有两个条目,等等。

只需将一个true传递到StreamWriter的构造函数中即可

static public void SerializeToXML(Actor actor)
{
    XmlSerializer serializer = new XmlSerializer(typeof(Actor));
    TextWriter textWriter = new StreamWriter(@"c:\users\Desktop\actor.xml",true);
    serializer.Serialize(textWriter, actor);
    textWriter.Close();
}

至于修复Xml,您可以使用Linq To Xml创建有效的Xml并一次性将其保存到文件中

只需将true传递到StreamWriter的构造函数中即可

static public void SerializeToXML(Actor actor)
{
    XmlSerializer serializer = new XmlSerializer(typeof(Actor));
    TextWriter textWriter = new StreamWriter(@"c:\users\Desktop\actor.xml",true);
    serializer.Serialize(textWriter, actor);
    textWriter.Close();
}

至于修复Xml,您可以使用Linq To Xml创建有效的Xml,并一次性将其保存到文件中

读取数据,将文件加载到StreamReader,然后在序列化程序上使用反序列化方法:

XmlSerializer serializer = new XmlSerializer(typeof(Actor));
TextReader textReader = new StreamReader(@"c:\users\Desktop\actor.xml");
Actor actor = (Actor)serializer.Deserialize(textReader);
textReader.Close();
(假设只有一个参与者保存在XML文件中) 为了不覆盖,我建议您如上所述读取数据,然后更新对象,最后写入XML文件。通过这种方式,您可以根据需要保留XML文件中最初的内容

(假设您希望XML文件中有许多参与者) 您可能希望序列化列表,而不仅仅是Actor。如果是这样,您仍然可以读入数据(改为转换为列表),根据需要更新列表,然后序列化回XML文件


PS:我建议您使用C#

中的“using”语句读取数据,将文件加载到StreamReader,然后在序列化程序上使用反序列化方法,而不是在读写器和其他IDisposable对象上使用“Close”:

XmlSerializer serializer = new XmlSerializer(typeof(Actor));
TextReader textReader = new StreamReader(@"c:\users\Desktop\actor.xml");
Actor actor = (Actor)serializer.Deserialize(textReader);
textReader.Close();
(假设只有一个参与者保存在XML文件中) 为了不覆盖,我建议您如上所述读取数据,然后更新对象,最后写入XML文件。通过这种方式,您可以根据需要保留XML文件中最初的内容

(假设您希望XML文件中有许多参与者) 您可能希望序列化列表,而不仅仅是Actor。如果是这样,您仍然可以读入数据(改为转换为列表),根据需要更新列表,然后序列化回XML文件


PS:我建议您在C#中使用“using”语句,而不是在读写器和其他IDisposable对象上使用“Close”。

您认为追加XML会成功吗?我认为这会阻止文件被覆盖,这正是他们所要求的。他们在每次传递时都会覆盖foreach中的文件,但这不会创建有效的XML。因此,虽然它确实可以防止覆盖,但它并不能真正解决问题。你认为附加XML会成功吗?我认为它可以阻止文件被覆盖,这就是他们所要求的。他们在每次传递时都会覆盖foreach中的文件,但这不会创建有效的XML。因此,虽然它确实可以防止覆盖,但并不能真正解决问题。