0

この質問には 2 つの部分があります。まず、ユーザーがプログラムで [メモの追加] ボタンをクリックしたときに、ドキュメント内の XML 要素のコンテンツにテキストを追加できるようにする必要があります。私はこれを問題なく行うことができます。ただし、ユーザーが後でメモを追加したい場合、「setElementValue」メソッドを呼び出すため、元のメモは消去されます。既存のテキストを置き換えるのではなく、既存のテキストにメモを追加する代替手段はありますか?

public static void addNote(ListViewItem file, string note)
        {
            int i = 0;
            while (i < 20)
            {
                try
                {
                    XDocument doc = XDocument.Load(Form1.CSDBpath + Form1.projectName + "\\Data.xml");

                    string name = file.Text;
                    var el = (from item in doc.Descendants("dataModule")
                              where item.Descendants("DMC").First().Value == name
                              select item).First();

                    if (el != null)
                    {
                        el.SetElementValue("notes", note);
                    }

                    doc.Save(Form1.CSDBpath + Form1.projectName + "\\Data.xml");
                    return;
                }
                catch
                {
                    i++;
                }
            }
            MessageBox.Show("Please try again in a moment, system busy (3)", "DAWS");


        }

質問の 2 番目の部分: 私のコードでわかるように、多くのファイルのさまざまな情報を格納する xml データ ファイルにアクセスして書き込む必要があります (上記の質問によるメモを含む)。この xml データ ファイルは複数のユーザーによって共有されており、それらのユーザーのシステムが同時にファイルにアクセスしようとすることがあり、明らかに問題が発生しています。私はこれを回避するために、設定した回数だけループして、プログラムが繰り返し xml ファイルを開いて書き込もうとするようにしました。私はこれを受け入れられた方法で行っていますか、それとももっと良い方法がありますか?

4

3 に答える 3

1

どうですか:

el.SetElementValue("notes", el.value + " " + note);

2番目の部分に関しては、非常にスケーラブルなソリューションのようには思えません。小さなサービス (WCF など) を作成して、単一のファイル セットにアクセスする場合はどうでしょうか。

于 2013-05-07T14:03:13.383 に答える
0
if (string.IsNullOrWhiteSpace(el.Value))
    el.Value = note;
else
    el.Value += Environment.NewLine + note;

2 番目の問題については、ファイルを新しいファイル名 (data.xml.tmp) で保存し、その後、File.Move名前を変更するための呼び出しが必要になる場合があります。この方法では、ファイルにアクセスできない期間がずっと短くなります。

またSystem.IO.Path.Combine()、パスを文字列として連結しないでください。

于 2013-05-07T14:04:06.780 に答える
0

あなたの XML コードがどのように見えるかはわかりませんが、例があればいいのですが、XmlNode の ParentNode と AppendChild を使用して兄弟を追加してみてください。

また、シーケンスが空の可能性がある場合は、First() を使用しないでください。代わりに FirstOrDefault を使用してください。

于 2013-05-07T14:04:09.463 に答える