序列化为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(); }
    }

序列化为XML文档,而不覆盖以前的数据

仅接受文件名的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 );