无法保存对xml文件的更改

问题描述:

作为学习练习,我构建了一个简单的服务器IP存储和ping监视器应用程序。该应用程序从xml文件中读取服务器/主机列表,并将它们显示给用户,并允许他们ping通它们以检查其在线状态。无法保存对xml文件的更改

读取和ping功能正常工作,但编写代码添加额外的服务器实例时,代码不会将新元素保存到xml文件。

下面是serverlist.xml基本的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功能,但我似乎无法看到我错过了什么。

问题竟然是 '复制到输出目录' 属性为serverlist.xml文件。这意味着在调试期间在构建/重新构建解决方案时,xml文件的副本被新的未修改的原始xml文件覆盖。所以它看起来并没有完全保存,而是被覆盖了。

如果“serverList.xml”文件包含有效的XML文档,则您的XML保存代码可以正常工作。

我有几个建议:

  1. 如果serverList.xml文件不存在,要么返回后“没有XML可用!” MessageBox或创建一个新的XDocument(参见下文)

  2. 使用SetAttribute(“name”,txtServerName.Text)创建name =“Operations”属性。

  3. 确保您正在查看正确的“serverList.xml”文件。 “serverList.xml”需要与您正在运行的.exe位于同一文件夹中。如果你正在调试,然后 “serverList.xml” - > $(PROJECTDIR)\ BIN \调试\ 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 2013-05-09 14:25:43

+0

@markhlong - 不客气!很高兴我能帮上忙。 – 2013-05-09 16:04:31