2013-05-15 51 views
0

我需要序列化为XML文档而不覆盖当前存在的数据。我有一个方法可以做到这一点,它将保存到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(); } 
    } 
+1

读取XML,追加新的项目,然后保存... – I4V

+0

**如果该文件存在,它被覆盖**([MSDN :StreamWriter构造函数(字符串)](http://msdn.microsoft.com/en-us/library/fysy0a4b.aspx),看下'备注') –

+0

所以没有办法在序列化时添加一个节点? – Jeff

回答

2

The contract for the StreamWriter constructor taking only a filename说,如果指定的文件存在,它将被覆盖。所以这与序列化XML本身无关。如果您通过其他方式写入流,则会得到相同的结果。

执行您所要查找的操作的方法是将旧的XML文件读入内存,进行必要的更改,然后将结果序列化并将结果写入磁盘。

即使可以透明地修改磁盘上的XML文件,这几乎可以肯定会发生什么,因为这是真正做到这一点的唯一方法。是的,你可能可能无法直接在磁盘上寻找和写入,但如果在你做这些事情时某些事情导致文件在磁盘上发生变化,该怎么办?如果您执行读取/修改/写入序列,那么您将在将文件读入内存之后所做的更改丢失了;但如果您通过查找和写入直接在磁盘上修改文件,则几乎可以保证文件处于不一致状态。

和当然,你可能只能做它,如果你能适应你想使之成为那些已经在磁盘上的字节任何改变......

如果并发问题,无论是使用文件锁定或使用具有事务支持的适当数据库。

0

所以你想实现的是序列化一个对象而不会覆盖它到一个现有的文件。

因此

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); 
+0

这种方法的问题是(至少如果做得多),它几乎肯定会导致错误的XML文档,因为整个XML文档必须包含在一个最外面的标签中。所以你必须有' ...',你不能有' ... ...'或其任何变体。 –

0

试试这个:

StreamWriter writer = new StreamWriter(Server.MapPath("~/App_Data/Contents.xml"),true); 

这个决定将数据追加到该文件。

真正=追加, 假=覆盖

更多信息http://msdn.microsoft.com/en-us/library/36b035cb.aspx

+0

这样做可以添加它,但它也会添加根节点。我只需要保存字段。 – Jeff

相关问题