2013-05-09 4 views
1

В качестве учебного упражнения я создаю простое приложение для хранения и хранения IP-адресов сервера. Приложение считывает список серверов/хостов из xml-файла и отображает их пользователю и позволяет им проверять их статус в Интернете.Невозможно сохранить изменения в xml-файле

Функция чтения и пинга работает нормально, но при написании кода для добавления дополнительного экземпляра сервера код не сохранит новый элемент в XML-файле.

Вот основная структура XML в serverlist.xml:

<servers> 
    <server name="Operations"> 
     <hostname>Operations</hostname> 
     <hostaddress>address</hostaddress> 
    </server> 
    <server name="Development"> 
     <hostname>development</hostname> 
     <hostaddress>address</hostaddress> 
    </server> 
</servers> 

А вот код, который я использовал, чтобы добавить новый элемент server:

private void btnAdd_Click(object sender, EventArgs e) 
     { 
      XDocument xDocument = new XDocument(); 
      try 
      { 
       if (txtHostName.Text == "" || txtHostAddress.Text == "") 
       { 
        MessageBox.Show("Please complete the fields shown!", "Complete form", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
       } 
       else 
       { 
        // Add element to XML 
        if (File.Exists("serverlist.xml")) 
        { 
         xDocument = XDocument.Load("serverlist.xml"); 
        } 
        else 
        { 
         MessageBox.Show("No XML available!", "Error", MessageBoxButtons.OK); 
        } 

        XElement newServer = new XElement("server", txtServerName.Text, 
          new XElement("hostname", txtHostName.Text), 
          new XElement("hostaddress", txtHostAddress.Text)); 

        xDocument.Root.Add(newServer); 


        xDocument.Save("Serverlist.xml"); 
        MessageBox.Show("Server Added!", "Server Added", MessageBoxButtons.OK, MessageBoxIcon.Information); 
       } 

      } 

Я не вижу каких-либо ошибок или клаузулы catch, элемент просто не сохраняется в XML. Это, наверное, очень простая и глупая вещь, но я сделал много поисковых систем (другие поисковые системы доступны!) И исследование функций XML, но я не могу видеть, что я пропустил.

ответ

0

Проблема оказалась быть 'Копировать в выходной каталог' собственности для файла serverlist.xml. Это означало, что при построении/перестройке решения во время отладки копия xml-файла была перезаписана новым неизмененным исходным xml-файлом. Так что это не выглядело так, будто оно было спасено вообще, тогда как оно было, но затем переписано.

1

Ваш код сохранения XML отлично работает, если файл «serverList.xml» содержит допустимый XML-документ.

У меня есть несколько предложений:

  1. Если файл serverList.xml не существует, либо возвращение после "No XML Доступно!" MessageBox ИЛИ создать новый XDocument (см. Ниже)

  2. Используйте SetAttribute ("name", txtServerName.Text), чтобы создать атрибут name = "Operations".

  3. Убедитесь, что вы смотрите на правый файл "serverList.xml". «serverList.xml» должен находиться в той же папке, что и вы .exe. При отладке, то "serverList.xml" -> $ (ProjectDir) \ Bin \ Debug \ serverList.xml

    private void button1_Click(object sender, EventArgs e) 
    { 
        XDocument xDocument = new XDocument(); 
        try 
        { 
         // Add element to XML 
         if (File.Exists(@"C:\Projects\serverlist.xml")) 
         { 
          xDocument = XDocument.Load(@"C:\Projects\ServerList.xml"); 
         } 
         else 
         { 
          MessageBox.Show("No XML available!", "Error", MessageBoxButtons.OK); 
    
          // create new document 
          xDocument.Add(new XElement("servers")); 
         }     
    
         XElement newServer = new XElement("server", 
           new XElement("hostname", txtHostName.Text), 
           new XElement("hostaddress", txtHostAddress.Text)); 
         newServer.SetAttributeValue("name", txtServerName.Text); 
    
         xDocument.Root.Add(newServer); 
    
         xDocument.Save(@"C:\Projects\Serverlist.xml"); 
         MessageBox.Show("Server Added!", "Server Added", MessageBoxButtons.OK, MessageBoxIcon.Information); 
        } 
        catch (Exception exc) 
        { 
         MessageBox.Show(exc.ToString(), "Error"); 
        } 
    } 
    
+0

Спасибо, что Стив! Хотя это не совсем то решение, которое привело меня к разработке того, что было не так! Я случайно установил свойство «Копировать в выходной каталог» файла serverlist.xml как «Копировать всегда», а не «Копировать, если новый», поэтому каждый раз, когда я его создавал и отлаживал, он переписывал файл с новой, неотредактированной копией. Я внедрил пару изменений, которые вы предложили, чтобы сделать мой код лучше и функциональнее. – markhlong

+0

@markhlong - добро пожаловать! Рад, что смог помочь. –

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