2013-05-07 74 views
0

这个问题有两个部分:首先,我需要能够添加文本到文档中的XML元素的内容,当用户点击'添加注释'按钮在我的程序中。我可以做到这一点没有问题。但是,如果用户稍后想要添加更多笔记,由于我称之为'setElementValue'方法,原始笔记将被清除。是否有替代方案,以便将注释添加到现有文本中,而不是替换现有文本?将字符串添加到XML文件而不删除现有的字符串

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文件。我是否以公认的方式去解决这个问题,还是有更好的方法?

回答

1

如何:

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

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

+0

谢谢。那很简单! :)至于第二部分,我不得不考虑一下,因为我不知道如何设置它。感谢指针,但。 – Daedalus 2013-05-07 14:06:40

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

对于您可能希望将文件保存到一个新的文件名中的第二个问题(data.xml.tmp)和呼叫File.Move后,将其重命名。通过这种方式,文件将无法在更短的时间内访问。

也审查System.IO.Path.Combine() - 你不应该将路径连接为字符串。

0

我不确定你的XML代码的外观如何,这将是一个很好的例子,但你可以尝试使用XmlNode的ParentNode和AppendChild添加一个兄弟。

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