Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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_Wpf_Linq - Fatal编程技术网

C# XML文件更新

C# XML文件更新,c#,xml,wpf,linq,C#,Xml,Wpf,Linq,我目前正在用一个登录系统实现一个wpf应用程序。连接服务器并调用数据库比基于文件的数据库慢,我们认为xml文件对我们来说很好 我的问题实际上与本主题中所述的问题相同: 当我将它添加到项目中时,它会在app根目录(WpfApplication1\WpfApplication1\myfile.xml)中查找它。但是,当我运行应用程序时,负责添加节点的函数工作正常,但它会将文件保存到WpfApplication1\WpfApplication1\bin\Debug\目录!因此,“真实的”myfile.

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

我的问题实际上与本主题中所述的问题相同:

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

我尝试过这样的评论:“如果您希望从光盘加载(并修改)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文档都会被重写

如果希望此文件是数据库类型的文件,除非对其进行了更改,否则不希望它被XML文件覆盖构建操作“无”是好的,但我认为您希望复制到输出控制器为“不复制”。您需要手动将文件FTP到预期的目录中


然后,将XML文件放在bin文件夹中,而不是放在参考资料中。您网站的访问者将无法访问该信息。

完全无关:XML文件可能不是存储未加密密码的最佳位置。您建议如何存储此类信息?这已得到回答。我已经在使用sha256对密码信息进行哈希处理,但请提前感谢!你确定吗?您的代码似乎提出了不同的建议:
new-XElement(“password”,this.textBox2.Text),
-您现在不需要过多地关注密码散列。您还需要担心其他事情,但这是您应该注意的。我认为名为“SaveLoginFotoDisk”的方法是关键部分。我尝试了此操作,但无效。我试图理解,LogInUpdater.xml是复制更新信息的另一个文件?因为您的xml文件已设置为内容,所以正在将其复制到“bin\Debug”文件夹。您需要更新GetLoginInfoFilePath以反映这一点(即
System.AppDomain.CurrentDomain.BaseDirectory+“Debug\LogInUpdater.xml”;
)现在检查,我根据我用于检查案例的其他文件错误地键入了它,但您使用的是不同的文件,因此请将其更改为user,xml希望它现在可以正常工作,因为这是肯定的。只有管理员用户才能将用户信息添加到xml数据库中,所以后面的代码必须能够覆盖xml文件。当我将xml文件添加到项目(VisualStudio项目)中时,它不是在bin文件夹中创建的,而是默认在应用程序的文件夹中创建的。但在调试模式下,它会在/bin/debug文件夹中创建一个副本。现在我无法更改基本xml文件的文件路径。我不认为ftp对我来说是无效的,因为它不是一个web应用程序,它是一种windows窗体应用程序。如果您为XML文件指定生成操作,那么它将需要进入您的生成目录,即bin文件夹。如果您未为XML文件指定任何操作并始终复制,则它应保持在项目中的相同位置。当BuildAction=“None”和CopytoOutputDirector=“Do not Copy”时,它会引发一个异常,表示它正在/bin/Debug文件夹中查找XML文件,但它找不到。:)这是因为您在上面的第一条评论中说,您的应用程序文件夹中有它。因此,您的代码需要在这个应用程序文件夹中查找它,而不是在bin文件夹中。相对路径为“.\app\users.xml”。“.\”指示它查找一个级别。这取决于您希望以何种方式执行,但您必须在编码中遵循该决定。
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());
        }