【问题标题】:XML File UpdateXML 文件更新
【发布时间】:2015-07-24 12:41:50
【问题描述】:

我目前正在实现一个带有登录系统的 wpf 应用程序。连接服务器并调用数据库比基于文件的数据库慢,我们认为xml文件对我们来说很好。

我的问题其实和这个题目中的问题是一样的:

当我将它添加到项目中时,它会在应用程序根目录 (WpfApplication1\WpfApplication1\myfile.xml) 中查找它。但是当我运行该应用程序时,负责添加节点的功能工作正常,但它将文件保存到 WpfApplication1\WpfApplication1\bin\Debug\ 目录!因此“真实”的 myfile.xml 没有更新

WPF C# XML file added as resource

我尝试了评论“如果您希望从光盘加载 xml(并进行修改),请使用 Build Action = None 和 Copy = Copy Always。” ,但它对我不起作用。

我使用 System.Xml.Linq 库,并尝试使用这段代码更新我的 XML 文件:

  XDocument xmlDoc = XDocument.Load("users.xml");
               xmlDoc.Root.Add(
                    new XElement("user",
                        new XElement("username", this.textBox1.Text),
                        new XElement("password", this.textBox2.Text),
                        new XElement("ITAdmin", comboBox1.SelectedText == "Yes" ? 1 : 0)));

                xmlDoc.Save("users.xml");

我的第二个问题是我已将 xml 文件作为资源添加到我的项目中,因为我不希望应用程序用户可以访问它,但我无法再次更新 xml 文件。

【问题讨论】:

  • 完全不相关:XML 文件可能不是存储未加密密码的最佳位置。
  • 您对存储此类信息有何建议?
  • 这已经回答here
  • 我已经在用 sha256 对密码信息进行哈希处理,但提前谢谢你!
  • 你确定吗?您的代码似乎另有建议:new XElement("password", this.textBox2.Text), - 您无需过多关注散列密码现在。您还有其他事情要担心,但这是您应该注意的事情。

标签: c# xml wpf linq


【解决方案1】:

如果您指定“始终复制”,那么每次更新/发布您的网站时,您的 XML 文档都会被覆盖。

如果您希望这是一个数据库类型的文件,您不会希望它被您的 XML 文件覆盖,除非您对其进行了更改。 构建操作“无”很好,但我认为您希望复制到输出主管为“不复制”。您需要手动将您的文件通过 FTP 传输到预期所在的目录。

然后,不要将 XML 文件放在 Resources 中,而是将其放在 bin 文件夹中。您网站的访问者将无法访问它。

【讨论】:

  • 只有管理员用户才能将用户信息添加到 xml 数据库中,因此代码隐藏必须具有覆盖 xml 文件的能力。当我将 xml 文件添加到项目(Visual Studio 项目)中时,它不是在 bin 文件夹中创建的,而是默认在 app 的文件夹中创建的。但在调试模式下,它会在 /bin/Debug 文件夹中创建一个副本。现在我无法更改基本 xml 文件的文件路径。我不认为 ftp 对我无效,因为它不是 Web 应用程序,它是一种 Windows 窗体应用程序。
  • 如果您为 XML 文件指定构建操作,那么它将需要进入您的构建目录,即 bin 文件夹。如果您未为 XML 文件指定任何操作并始终复制,则它应保留在项目中的相同位置。
  • 当 BuildAction="None" 和 CopytoOutputDirector="Do not copy" 时,它会抛出一个异常,说它正在 /bin/Debug 文件夹中寻找一个 xml 文件,但它找不到。
  • :) 那是因为您在上面的第一条评论中说您在 app 文件夹中有它。因此,您的代码需要在这个 app 文件夹而不是 bin 文件夹中查找它。相对路径是“..\app\users.xml”。 “..\”指示它向上查找一级。这取决于您想采用哪种方式,但您必须在编码中遵循该决定。
【解决方案2】:
try this



 private void AddToXmlLogInInfoDoc()
            {
                var x = this.DataContext as ViewModel.ViewModel;
                string path = System.AppDomain.CurrentDomain.BaseDirectory + "users.xml";
                XDocument  doc;
                doc = XDocument.Load(path);
                XElement ele = new XElement("LogUpdate",
                        new XElement("Id",
                            new XAttribute("Id", IdL.Text)),
                        new XElement("Name",
                            new XAttribute("Name", NameL.Text)),
                        new XElement("Password",
                            new XAttribute("Password", txtPassword.Password.ToString())),
                        new XElement("Department",
                            new XAttribute("Department", DeptL.Text)),
                        new XElement("Time",
                            new XAttribute("Time", x.LogTime.ToString())),
                        new XElement("TotalTime",
                            new XAttribute("TotalTime", x.TotalTime.ToString())),
                        new XElement("Log",
                            new XAttribute("Log", x.Log.ToString())));
                doc.Root.Add(ele);
                SaveLoginInfoToDisk(doc);
            }
private string GetLoginInfoFilePath()
        {
            return System.AppDomain.CurrentDomain.BaseDirectory + "users.xml";
        }

        private void SaveLoginInfoToDisk(XDocument document)
        {
            document.Save(GetLoginInfoFilePath());
        }

【讨论】:

  • 我认为名为“SaveLoginInfoToDisk”的方法是关键部分。我试过这个,但没有用。
  • 我试试看明白了,LogInUpdater.xml是另一个文件复制更新信息?
  • 由于您的 XML 文件设置为内​​容,它被复制到您的“bin\Debug”文件夹。您需要更新 GetLoginInfoFilePath 以反映这一点(即System.AppDomain.CurrentDomain.BaseDirectory + "Debug\LogInUpdater.xml";
  • 现在检查,我根据我用来检查案例的其他文件输入错误,但您使用的是不同的,所以请更改为 user,xml
  • 希望它现在很好,并且它也能正常工作,因为它肯定被击中了。
猜你喜欢
  • 2014-03-25
  • 2014-08-11
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 2015-07-28
  • 2021-12-31
相关资源
最近更新 更多