我目前正在开发一个涉及C#中的注册/登录表单的项目。我使用平面文件(XML)来存储注册信息,并在C#中使用Xml.Linq来做到这一点。
我目前无法使用我的登录验证码,因为它已经停止工作,因为我将注册码更改为linq版本。我得到的错误代码是......
"未处理的类型' System.NullReferenceException'发生在WaiterApp.exe中的附加信息:对象引用未设置为对象的实例。"。
我已经在下面包含了我的代码,如果有人可以帮我解决这个问题,因为我是C#的新手,我试图调试为什么会这样,但没有运气。谢谢:))
注册代码......
XElement xml = new XElement("RegisterInfo",
new XElement("User",
new XElement("Data1", nameTextBox.Text),
new XElement("Data2", emailTextBox.Text),
new XElement("Data3", passwordTextBox.Text),
new XElement("Data4", confirmPasswordTextBox.Text)
)
);
xml.Save("data.xml");
this.Hide();
Login ss = new Login();
ss.Show();
登录代码
XmlDocument doc = new XmlDocument();
doc.Load("data.xml"); //This code will load the Data xml document with the Login details.
foreach (XmlNode node in doc.SelectNodes("//RegisterInfo"))
{
String Username = node.SelectSingleNode("Data1").Value;
String Password = node.SelectSingleNode("Data3").Value;
if (Username == nameTextBox.Text && Password == passwordTextBox.Text)
{
MessageBox.Show("You have logged in!");
this.Hide();
Main ss = new Main();
ss.Show();
}
else
{
MessageBox.Show("Error Logging you in!");
}
Xml脚本
<?xml version="1.0" encoding="utf-8"?>
<RegisterInfo>
<User>
<Data1>Charlie</Data1>
<Data2>Charlie@gmail.com</Data2>
<Data3>1</Data3>
<Data4>1</Data4>
</User>
</RegisterInfo>
答案 0 :(得分:1)
您可以在路径中指定用户元素(您的代码):
doc.Load("data.xml");
foreach (XmlNode node in doc.SelectNodes("//RegisterInfo"))
{
//default xpath will be /RegisterInfo/Data1 and will not find the (Data Element) in (RegisterInfo)
String Username = node.SelectSingleNode("Data1").InnerTex; // so this will be null
String Password = node.SelectSingleNode("Data3").InnerTex; // so this will be null
// can't compare null, so null error will be thrown.
if (Username == nameTextBox.Text && Password == passwordTextBox.Text)
{
}
}
您应该做的是指定用户元素:
doc.Load("data.xml");
foreach (XmlNode node in doc.SelectNodes("/RegisterInfo/User")) //xpath to /RegisterInfo/User
{
String Username = node.SelectSingleNode("Data1").InnerTex; // get value of Data1 Value.
String Password = node.SelectSingleNode("Data3").InnerTex; // get value of Data3 Value.
}