C# XML被改写,然后程序被重新打开

C# XML被改写,然后程序被重新打开,c#,C#,这是我的代码 public List<Serialization> list = null; private void UCAPIn_Load(object sender, EventArgs e) { list = new List<Serialization>(); if (File.Exists("date.XML")) { var doc = XDocument.Load("data.XML"); f

这是我的代码

public List<Serialization> list = null;
private void UCAPIn_Load(object sender, EventArgs e)
{
    list = new List<Serialization>();

    if (File.Exists("date.XML"))

    {
        var doc = XDocument.Load("data.XML");


        foreach (XElement element in doc.Descendants("Serialization"))
        {

            list.Add(new Serialization()
            { ID = element.Element("ID").Value,
                APIKEY = element.Element("APIKEY").Value,
                VCODE = element.Element("VCODE").Value });
        }
    }
}

public void button1_Click(object sender, EventArgs e)
{
    {
        try
        {
            Serialization info = new Serialization();                    
            info.APIKEY = txtAPI.Text;
            info.VCODE = txtVerC.Text;
            info.ID = Guid.NewGuid().ToString();                                   
            list.Add(info);                    
            Serialization.SaveData(list, "data.XML");
        }

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

private void button2_Click(object sender, EventArgs e)
{
    this.Close();
}

private void whatIsThisToolStripMenuItem_Click(object sender, EventArgs e)
{

}
// end of UCAPIn

public class Serialization
{
    private string id;
    private string APIkey;
    private string VCode;

    public string ID
    {
        get { return id; }
        set { id = value; }
    }

    public string APIKEY
    {
        get { return APIkey; }
        set { APIkey = value; }
    }

    public string VCODE
    {
        get { return VCode; }
        set { VCode = value; }
    }

    public static void SaveData(List<Serialization> list, string Filename)
    {

        File.Delete(Filename);
        XmlSerializer sr = new XmlSerializer(list.GetType());                    
        TextWriter writer = new StreamWriter(Filename, true);            
        sr.Serialize(writer, list); 
        writer.Close();
    }
}
public List=null;
私有无效UCAPIn_加载(对象发送方,事件参数e)
{
列表=新列表();
如果(File.Exists(“date.XML”))
{
var doc=XDocument.Load(“data.XML”);
foreach(文档子体中的XElement元素(“序列化”))
{
添加(新序列化()
{ID=element.element(“ID”).Value,
APIKEY=element.element(“APIKEY”).Value,
VCODE=element.element(“VCODE”).Value});
}
}
}
公共无效按钮1\u单击(对象发送者,事件参数e)
{
{
尝试
{
序列化信息=新序列化();
info.APIKEY=txtAPI.Text;
info.VCODE=txtVerC.Text;
info.ID=Guid.NewGuid().ToString();
列表。添加(信息);
SaveData(列表,“data.XML”);
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
}
私有无效按钮2\u单击(对象发送者,事件参数e)
{
这个。关闭();
}
私有void whatIsThisToolStripMenuItem\u单击(对象发送方,事件参数e)
{
}
//乌卡平端部
公共类序列化
{
私有字符串id;
私钥;
私有字符串VCode;
公共字符串ID
{
获取{return id;}
设置{id=value;}
}
公共字符串密钥
{
获取{return APIkey;}
设置{APIkey=value;}
}
公共字符串VCODE
{
获取{return VCode;}
设置{VCode=value;}
}
公共静态void SaveData(列表,字符串文件名)
{
删除(文件名);
XmlSerializer sr=新的XmlSerializer(list.GetType());
TextWriter writer=新的StreamWriter(文件名,true);
高级序列化(编写者、列表);
writer.Close();
}
}
它创建我的XML并添加到其中(多个条目),但当我关闭程序并重新打开它时,会在旧数据中添加更多数据,旧数据会被新数据覆盖

有人能帮我做这个吗

(提前感谢)

XML示例(当File.Delete(Filename);被删除时):

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfSerialization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Serialization>
        <ID>f2310827-93d0-42aa-9bfe-32624ee5f97b</ID>
        <APIKEY>1234</APIKEY>
        <VCODE>1234</VCODE>
    </Serialization>
</ArrayOfSerialization>

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfSerialization xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Serialization>
        <ID>df354c83-1ae2-4cfc-b802-c9682f24f3f6</ID>
        <APIKEY>123</APIKEY>
        <VCODE>123</VCODE>
    </Serialization>
</ArrayOfSerialization>

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfSerialization xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Serialization>
        <ID>df354c83-1ae2-4cfc-b802-c9682f24f3f6</ID>
        <APIKEY>123</APIKEY>
        <VCODE>123</VCODE>
    </Serialization>
    <Serialization>
        <ID>a8f6737e-6c08-4e7a-b041-c16b502d4a60</ID>
        <APIKEY>1234</APIKEY>
        <VCODE>1234</VCODE>
    </Serialization>
</ArrayOfSerialization>

f2310827-93d0-42aa-9bfe-32624ee5f97b
1234
1234
df354c83-1ae2-4cfc-b802-c9682f24f3f6
123
123
df354c83-1ae2-4cfc-b802-c9682f24f3f6
123
123
a8f6737e-6c08-4e7a-b041-c16b502d4a60
1234
1234

希望此示例代码对您有所帮助

我使用的属性类与您使用的“序列化”相同

对于反序列化,请使用以下方法:

public List<Serialization> XMLDeserialize()
{
    XmlSerializer deserializer = new XmlSerializer(typeof(List<Serialization>));
    TextReader reader = new StreamReader(xmlPath);
    var XMLDeserialize = (List<Serialization>) deserializer.Deserialize(reader);
    reader.Dispose();
    return XMLDeserialize;
}
公共列表XMLDeserialize() { XmlSerializer反序列化器=新的XmlSerializer(typeof(List)); TextReader=新的StreamReader(xmlPath); var XMLDeserialize=(列表)反序列化器。反序列化(读取器); reader.Dispose(); 返回XMLDeserialize; } 要更新xml文件,请使用此函数:

public void UpdateXMLSerialize(List<Serialization> objXmlData)
{
    XmlSerializer serializer = new XmlSerializer(typeof(List<Serialization>));
    using (TextWriter writer = new StreamWriter(xmlPath))
    {
        serializer.Serialize(writer, objXmlData);
    }
}
public void UpdateXMLSerialize(列出objXmlData)
{
XmlSerializer serializer=新的XmlSerializer(typeof(List));
使用(TextWriter=新StreamWriter(xmlPath))
{
serializer.Serialize(writer,objXmlData);
}
}
要在单击事件时以xml格式添加新数据,请执行以下操作:

private void Add_Click(object sender, EventArgs e)
{
    List<Serialization> list = new List<Serialization>();

    if (File.Exists(xmlPath))
    {
        list = XMLDeserialize();

        Serialization obj = new Serialization() { ID = "NewData", APIKEY = "NewAPIKey", VCODE = "NewVCode" };
        list.Add(obj);
        UpdateXMLSerialize(list);              
    }
}
private void Add\u单击(对象发送者,事件参数e)
{
列表=新列表();
if(File.Exists(xmlPath))
{
list=XMLDeserialize();
Serialization obj=newserialization(){ID=“NewData”,APIKEY=“NewAPIKey”,VCODE=“NewVCode”};
列表。添加(obj);
UpdateXMLSerialize(列表);
}
}

您在哪里调用UCAPIn_Load()?是表单加载事件吗?您测试名为date.xml的文件的存在性,然后加载名为data.xml的文件,这样在第一次重写时它就不会被加载,数据也会丢失。既然如此,我可以问您为什么要使用XDocument并编写大量代码,而不是定义一个类并使用xml序列化将文件直接读写到y中我们的类?嗯,你的
SaveData()
函数在一开始调用
File.Delete()
,所以难怪你的旧数据消失了?或者我只是不理解这个问题?很难理解你的代码(默认名称的情况太多了),但是任何系统混合了对XML的不同操作方式(例如LINQ到XML和XML序列化)会有问题的。