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序列化)会有问题的。