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