1

作为学习练习,我正在构建一个简单的服务器 IP 存储和 ping 监控应用程序。应用程序从 xml 文件中读取服务器/主机列表,并将它们显示给用户,并允许他们通过 ping 命令检查其在线状态。

读取和 ping 功能工作正常,但在编写代码以添加额外的服务器实例时,代码不会将新元素保存到 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 函数,但我似乎看不出我错过了什么。

4

2 回答 2

1

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

我有几个建议:

  1. 如果 serverList.xml 文件不存在,则在“No XML Available!”之后返回。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");
        }
    }
    
于 2013-05-09T12:30:42.100 回答
0

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

于 2013-05-10T06:53:34.260 回答