为了账号安全,请及时绑定邮箱和手机立即绑定

带有 XML 文件的身份验证表单

带有 XML 文件的身份验证表单

C#
慕森卡 2021-11-28 20:14:07
我需要有关此身份验证表格的帮助。这是xml文件:  <USER_LIST>    <user>      <name>giulio</name>      <password>prova</password>    </user>    <user>      <name>giulia</name>      <password>prova1</password>    </user>    <user>      <name>renato</name>      <password>zero</password>    </user>  </USER_LIST>这是我写的代码:private void button4_Click(object sender, EventArgs e)        {            XmlDocument doc = new XmlDocument();            doc.Load("dati.txt");            foreach (XmlNode node in doc.SelectNodes("//user"))            {                String User = node.SelectSingleNode("name").InnerText;                String Pass = node.SelectSingleNode("password").InnerText;                if (User == textBox1.Text && Pass == textBox2.Text)                {                    button1.Visible = true;                    dlt_btn.Visible = true;                    button3.Visible = true;                    button3.Visible = true;                    button5.Visible = true;                    return;                }                else                {                    MessageBox.Show("Invalid Username or Password!");                }            }         }但是像这样,例如,如果我使用名称“renato”和密码“零”登录,它会返回两次消息框“用户名或密码无效!” 第三次它显示所需的按钮。我知道为什么,但我想不出另一种方法来做到这一点。这是我的第一个项目,我像昨天一样开始编码,所以如果问你这样的愚蠢事情,我很抱歉。提前谢谢你的帮助!
查看完整描述

3 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

我想这只是为了学习目的或应该保持简单的作业,否则根本不安全。


您不需要使用循环。目前,您的循环循环会一一检查所有节点,对于与给定用户/密码不匹配的每个节点,都会显示消息框,这就是为什么您会看到消息框,直到循环到达正确的用户/密码为止。


在不使用循环的情况下,您可以通过这种方式轻松检查给定的用户/密码是否存在于您的 xml 文件中:


var userName = userNameTextBox.Text;

var password = passwordTextBox.Text;

var match = System.Xml.Linq.XElement.Load(@"d:\users.xml")

    .Elements("user")

    .Where(x => x.Element("name")?.Value == userName &&

                x.Element("password")?.Value == password)

    .Any();

然后如果match不是真的,你可以显示消息框。


查看完整回答
反对 回复 2021-11-28
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

问题是每次检查 XML 中不匹配的条目时都会显示消息框。


对代码进行最少更改的最简单方法如下:


private void button4_Click(object sender, EventArgs e)

{

    XmlDocument doc = new XmlDocument();

    doc.Load("dati.txt");


    bool found = false;


    foreach (XmlNode node in doc.SelectNodes("//user"))

    {

        String User = node.SelectSingleNode("name").InnerText;

        String Pass = node.SelectSingleNode("password").InnerText;


        if (User == textBox1.Text && Pass == textBox2.Text)

        {

            found = true;

            break;

        }

    }


    if (found)

    {

        button1.Visible = true;

        dlt_btn.Visible = true;

        button3.Visible = true;

        button3.Visible = true;

        button5.Visible = true;

    }

    else

    {

        MessageBox.Show("Invalid Username or Password!");

    }

我们创建一个名为的变量found并将其设置为false. 这是为了确保如果 XML 为空或没有匹配项,我们将无法通过检查。


然后我们遍历结果并设置found = true是否找到匹配项。我们调用 break 来跳出循环。


循环完成后,我们检查局部变量是否为真:


if (found)

这是简写 if (found == true)


如果这是真的,那么我们会像以前一样启用您的按钮。如果它不正确,那么我们将显示错误消息。


它只会显示一次错误消息。



查看完整回答
反对 回复 2021-11-28
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

这是一个解决方案,有效:


private void button4_Click(object sender, EventArgs e)

{

    string username;

    string password;

    string CurrentUser = "";

    string CurrentPwd = "";

    bool LoginStatus = false;


    username = textBox1.Text;

    password = textBox2.Text;


    XmlDocument xmxdoc = new XmlDocument();

    xmxdoc.Load("dati.txt");

    XmlNodeList xmlnodelist = xmxdoc.GetElementsByTagName("user");


    foreach (XmlNode xn in xmlnodelist)

    {

        XmlNodeList xmlnl = xn.ChildNodes;

        foreach (XmlNode xmln in xmlnl)

        {

            if (xmln.Name == "name")

            {

                if (xmln.InnerText == username)

                {

                    CurrentUser = username;

                }

            }

            if (xmln.Name == "password")

            {

                if (xmln.InnerText == password)

                {

                    CurrentPwd = password;

                }

            }

        }

        if ((CurrentUser != "") & (CurrentPwd != ""))

        {

            LoginStatus = true;

        }

    }

    if (LoginStatus == true)

    {

        button1.Visible = true;

        dlt_btn.Visible = true;

        button3.Visible = true;

        button3.Visible = true;

        button5.Visible = true;

        return;

    }

    else

    {

        MessageBox.Show("Invalid Username or Password!");

    }

}


查看完整回答
反对 回复 2021-11-28
  • 3 回答
  • 0 关注
  • 193 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信