将字符串添加到XML文件而不删除现有字符串

时间:2013-05-07 13:56:49

标签: c# xml

这个问题有两个部分:首先,当用户点击程序中的“添加注释”按钮时,我需要能够在文档中的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文件。我是否以公认的方式谈论这个问题,还是有更好的方式?

3 个答案:

答案 0 :(得分:1)

怎么样:

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

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

答案 1 :(得分:0)

if (string.IsNullOrWhiteSpace(el.Value))
    el.Value = note;
else
    el.Value += Environment.NewLine + note;

对于第二个问题,您可能希望将文件保存为新文件名(data.xml.tmp),然后调用File.Move进行重命名。这样,文件将无法在更短的时间内访问。

另请查看System.IO.Path.Combine() - 您不应将路径连接为字符串。

答案 2 :(得分:0)

我不确定你的XML代码看起来如何,一个例子会很好,但你可以尝试使用XmlNode的ParentNode和AppendChild添加一个兄弟。

此外,如果序列可能为空,则不应使用First()。请改用FirstOrDefault。