0

如何在不覆盖以前数据的情况下将数据序列化为 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; }
 }
}

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

4

3 回答 3

4

听起来你应该创建一个List<Actor>- 然后你可以从一个条目的列表开始,序列化该列表,然后下一次反序列化列表,添加一个演员,然后再次序列化,这样你就会在列表中有两个条目接下来的时间等

于 2013-08-04T16:11:29.880 回答
1

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

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 文件中有许多演员)您可能希望序列化一个列表而不仅仅是演员。如果是这样,您仍然可以读取数据(改为转换为 List),根据需要更新列表,然后序列化回 XML 文件。

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

于 2013-08-04T16:16:48.063 回答
0

只需将 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 http://blogs.msdn.com/b/wriju/archive/2008/02/18/linq-to-xml-creating-complex-xml-through-linq .aspx以创建有效的 XML 并将其保存到文件中

于 2013-08-04T16:11:38.947 回答