2013-05-07 2 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

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-код, было бы неплохо с примером, но вы могли бы попробовать добавить родного брата, используя ParentNode и AppendChild от XmlNode.

Кроме того, вы не должны использовать First(), если ваша последовательность может быть пустой. Вместо этого используйте FirstOrDefault.

Смежные вопросы