Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法保存对xml文件的更改_C#_Xml_Winforms_Linq To Xml - Fatal编程技术网

C# 无法保存对xml文件的更改

C# 无法保存对xml文件的更改,c#,xml,winforms,linq-to-xml,C#,Xml,Winforms,Linq To Xml,作为学习练习,我正在构建一个简单的服务器IP存储和ping监视器应用程序。应用程序从xml文件中读取服务器/主机列表,并向用户显示这些服务器/主机,并允许用户ping这些服务器/主机以检查其联机状态 读取和ping功能工作正常,但在编写代码以添加其他服务器实例时,代码不会将新元素保存到xml文件中 以下是serverlist.XML中的基本XML结构: <servers> <server name="Operations"> <hostname>

作为学习练习,我正在构建一个简单的服务器IP存储和ping监视器应用程序。应用程序从xml文件中读取服务器/主机列表,并向用户显示这些服务器/主机,并允许用户ping这些服务器/主机以检查其联机状态

读取和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>

我没有看到任何错误或catch子句,只是没有将元素保存到XML中。这可能是一件非常简单和愚蠢的事情,但我做了很多谷歌搜索(其他搜索引擎也有!)和研究XML函数,但我似乎看不出我遗漏了什么。

如果“serverList.XML”文件包含有效的XML文档,那么XML保存代码工作正常

我有几点建议:

  • 如果serverList.xml文件不存在,请在“No xml Available!”消息框后返回,或创建一个新的XDocument(见下文)

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

  • 确保查看的是正确的“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");
        }
    }
    

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

    我有几点建议:

  • 如果serverList.xml文件不存在,请在“No xml Available!”消息框后返回,或创建一个新的XDocument(见下文)

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

  • 确保查看的是正确的“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");
        }
    }
    

  • 问题是
    serverlist.xml
    文件的“复制到输出目录”属性。这意味着在调试期间构建/重建解决方案时,xml文件的副本将被新的未修改的原始xml文件覆盖。因此,它看起来一点也没有被保存,但是它被覆盖了。

    问题是
    serverlist.xml
    文件的“复制到输出目录”属性。这意味着在调试期间构建/重建解决方案时,xml文件的副本将被新的未修改的原始xml文件覆盖。因此,它看起来一点也没有被保存,但后来被覆盖了。

    感谢史蒂夫!虽然这并不是完全的解决方案,但它让我找出了问题所在!我不小心将
    serverlist.xml
    文件的“Copy to Output Directory”属性设置为“Copy always”,而不是“Copy if newer”,因此每次构建和调试时,它都会用一个新的、未编辑的副本覆盖该文件。为了使我的代码更好、更实用,我已经实现了您建议的一些更改。谢谢您!虽然这并不是完全的解决方案,但它让我找出了问题所在!我不小心将
    serverlist.xml
    文件的“Copy to Output Directory”属性设置为“Copy always”,而不是“Copy if newer”,因此每次构建和调试时,它都会用一个新的、未编辑的副本覆盖该文件。为了使我的代码更好、更实用,我已经实现了您建议的一些更改。