0

現在そこにあるデータを上書きせずに、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(); }
    }
4

3 に答える 3

2

StreamWriterファイル名のみを受け取るコンストラクターのコントラクトは、名前付きファイルが存在する場合は上書きされることを示しています。したがって、これは XML へのシリアル化自体とは何の関係もありません。他の方法でストリームに書き込んだ場合も、同じ結果が得られます。

探していることを行う方法は、古い XML ファイルをメモリに読み込み、必要な変更を行い、シリアル化して結果をディスクに書き込むことです。

また、ディスク上の XML ファイルを透過的に変更することができたとしても、それが実際にそれを行う唯一の方法であるため、内部で起こることはほぼ確実です。はい、おそらくディスク上で直接シークして書き込むことをいじることができますが、そうしている間に何かがディスク上のファイルを変更した場合はどうなるでしょうか? 読み取り/変更/書き込みのシーケンスを実行すると、ファイルをメモリに読み取った後に加えられた変更が失われます。しかし、シークと書き込みによってディスク上のファイルを直接変更すると、ほぼ確実にファイルが一貫性のない状態になります。

そしてもちろん、ディスク上に既に存在するバイトに変更を加えることができる場合にのみ、それを行うことができます...

同時実行性に問題がある場合は、ファイル ロックを使用するか、トランザクションをサポートする適切なデータベースを使用してください。

于 2013-05-15T14:45:40.453 に答える
0

これを試して:

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

これにより、データをファイルに追加することが決定されます。

true = 追加、false = 上書き

詳細http://msdn.microsoft.com/en-us/library/36b035cb.aspx

于 2013-05-15T15:59:10.087 に答える
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 );
于 2013-05-15T14:52:47.257 に答える