序列化为XML文档,而不覆盖以前的数据
本文关键字:覆盖 数据 XML 文档 序列化 | 更新日期: 2023-09-27 18:13:49
我需要序列化到XML文档,而不覆盖当前存在的数据。我有一个方法可以做到这一点,它将保存到xml文件中,但在序列化时将删除该文件中当前的任何内容。下面是代码。
public void SaveSubpart()
{
SOSDocument doc = new SOSDocument();
doc.ID = 1;
doc.Subpart = txtSubpart.Text;
doc.Title = txtTitle.Text;
doc.Applicability = txtApplicability.Text;
doc.Training = txtTraining.Text;
doc.URL = txtUrl.Text;
StreamWriter writer = new StreamWriter(Server.MapPath("~/App_Data/Contents.xml"));
System.Xml.Serialization.XmlSerializer serializer;
try
{
serializer = new System.Xml.Serialization.XmlSerializer(doc.GetType());
serializer.Serialize(writer, doc);
}
catch (Exception ex)
{
//e-mail admin - serialization failed
}
finally
{ writer.Close(); }
}
仅接受文件名的StreamWriter
构造函数的契约表明,如果命名文件存在,它将被覆盖。因此,这本身与序列化为XML无关。如果通过其他方式写入流,也会得到相同的结果。
您正在寻找的方法是将旧的XML文件读入内存,做任何必要的更改,然后序列化并将结果写入磁盘。
即使可以透明地修改磁盘上的XML文件,这也几乎肯定会在底层发生,因为这是真正做到这一点的唯一方法。是的,您可能可以直接在磁盘上查找和写入,但是如果在您这样做的时候,某些东西导致磁盘上的文件发生了变化,该怎么办呢?如果您执行读/修改/写顺序,那么您将失去在将文件读入内存后所做的更改;但是,如果您通过查找和写入直接在磁盘上修改文件,则几乎可以保证文件处于不一致状态。
当然,只有当你可以把你想要做的任何更改放入磁盘上的字节中时,你才能这样做…
如果并发性是一个问题,要么使用文件锁定,要么使用具有事务支持的合适数据库
try this:
StreamWriter writer = new StreamWriter(Server.MapPath("~/App_Data/Contents.xml"),true);
决定将数据追加到文件中。
真的=追加,False = overwrite
更多信息http://msdn.microsoft.com/en-us/library/36b035cb.aspx
所以你想要实现的是序列化一个对象而不覆盖它到一个现有的文件。
因此,XmlSerializer s = new XmlSerializer(doc.GetType());
TextWriter w = new StringWriter();
s.Serialize(w, doc);
var yourXMLstring = w.ToString();
然后你可以处理这个xml字符串,如果你想把它附加到现有的xml文件。
XmlDocument xml = new XmlDocument();
xml.LoadXml(yourXMLstring );