0

这个问题有两个部分:首先,当用户单击程序中的“添加注释”按钮时,我需要能够将文本添加到文档中 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");


        }

问题的第二部分:正如您在我的代码中看到的,我需要访问和写入一个 xml 数据文件,该文件存储大量文件的各种信息(包括上述问题的注释)。这个xml数据文件被多个用户共享,偶尔他们的系统试图同时访问该文件,这显然会导致问题。我已经通过循环一定次数来解决这个问题 - 使程序重复尝试打开并写入 xml 文件。我是以公认的方式解决这个问题,还是有更好的方法?

4

3 回答 3

1

怎么样:

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

至于第二部分,它听起来不像是一个非常可扩展的解决方案。编写一个小型服务(例如 WCF)并让它访问一组文件怎么样?

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

对于第二个问题,您可能希望将文件保存为新文件名 (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 回答