在不删除现有字符串的情况下向XML文件添加字符串

本文关键字:字符串 XML 文件 添加 情况下 删除 | 更新日期: 2023-09-27 18:12:32

这个问题有两个部分:首先,我需要能够在文档中添加文本到XML元素的内容,当用户单击我的程序中的' add Note'按钮时。我能做这件事,没问题。然而,如果用户以后想要添加更多的笔记,原始笔记将被删除,因为我调用了'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文件。我是按照公认的方式来做这件事,还是有更好的方法?

在不删除现有字符串的情况下向XML文件添加字符串

如何:

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

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

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

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

还要回顾System.IO.Path.Combine() -您不应该将路径连接为字符串

我不确定您的XML代码看起来如何,如果有一个示例就好了,但是您可以尝试使用XmlNode的ParentNode和AppendChild添加兄弟姐妹。

同样,如果序列可能为空,则不应该使用First()。使用FirstOrDefault