C#xml修改密码的一个错误
错误提示为“未将对象引用设置到对象的实例”XmlDocument doc = new XmlDocument();
XmlNode node;
XmlElement rootNode;
string sSelect;
doc.Load("登陆.xml");
rootNode = doc.DocumentElement;
sSelect = "//登陆[username='" + textBox1.Text + "']";
node = rootNode.SelectSingleNode(sSelect);
node.ChildNodes[1].InnerText = this.textBox4.Text; //就是这句出错
doc.Save("登陆.xml");
MessageBox.Show("修改成功,请重新登陆","提示");
Login log = new Login();
log.ShowDialog();
this.Hide(); --------------------编程问答-------------------- 来个人帮我解决下啊,过两天交作业了。哭!!!!!!!!!!! --------------------编程问答-------------------- 提示什么错误啊 --------------------编程问答-------------------- node.ChildNodes[1].InnerText = this.textBox4.Text; //就是这句出错
子结点不存在,你却在访问,所以给你一个那样的错误提示
ChildNodes[0]代表第一个子节点
ChildNodes[1]代表第二个子节点
看看你的XML文件是不是有第二个节点?
根据你的代码猜测一下你的XML文件内容是否如下:
<登陆>
<username>
<name>悟空</name>
<password>123</password>
</username>
<username>
<name>唐僧</name>
<password>321</password>
</username>
</登陆> --------------------编程问答--------------------
嗯,就是就是,我要改的是Password,就是第二个子节点啊,哪里错了啊?怎么改啊? --------------------编程问答-------------------- sSelect = "//登陆[username='" + textBox1.Text + "']";
看你上面这句就是出错的地方。
正确的写法:sSelect="/登陆/user[name='" + textBox1.Text + "']";
按照我的理解,你的每个元素名应该是user,其下有两个子节点,分别是name和password
<登陆>
<user>
<name>a</name>
<password>123</password>
</user>
</登陆>
因为sSelect = "//登陆[username='" + textBox1.Text + "']"; 这一句的问题
导致node = rootNode.SelectSingleNode(sSelect); 这句里的node值为null
你再对node.ChildNodes[1].InnerText 进行调用,实际上是调用一个空对象node,所以出错 --------------------编程问答-------------------- XmlNode node = root.SelectSingleNode("a/add[@name='']");
if(node !=null)
{}
--------------------编程问答--------------------
我照着修改了,但是还是不行。 --------------------编程问答-------------------- 贴出你的XML文件瞧瞧
上面代码我是在VS2008测试通过的 --------------------编程问答--------------------
<?xml version="1.0" encoding="utf-8"?>
<!--登陆-->
<LoginList>
<user>
<Username>liujia</Username>
<Password>liujia</Password>
</user>
<user>
<Username>lilu</Username>
<Password>lilu</Password>
</user>
<user>
<Username>zhangsan</Username>
<Password>zhangsan</Password>
</user>
<user>
<Username>lisi</Username>
<Password>lisi</Password>
</user>
</LoginList>
这样的。 --------------------编程问答-------------------- 我用的是2005 --------------------编程问答-------------------- <LoginList>才是根元素,<!--登陆--> 仅仅是注释,就象C#代码中的//一样
正确写法:
sSelect = "/LoginList/user[Username='" + textBox1.Text + "']";
你要补一下Xpath表达式的课 --------------------编程问答-------------------- 有两点补充:
一、注意代码中字符串的大小写要和XML文件中的一致
二、你的XML文件中的InnerText字符串后面都跟了一个空格,我相信你在TextBox中输入的时候并没有输入这个空格,所以你的问题是两方面的,一是XPath表达式错误,二是XML的编写有习惯性跟空格的错误 --------------------编程问答-------------------- private void button1_Click(object sender, EventArgs e)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("登陆.xml");
XmlNodeList usersList = xmlDoc.SelectNodes("/LoginList/user");
bool NoofYes = false;
for (int i = 0; i < usersList.Count; i++)
{
if (this.textBox1.Text.Equals(usersList[i].SelectSingleNode("Username").InnerText) && this.textBox2.Text.Equals(usersList[i].SelectSingleNode("Password").InnerText))
{
NoofYes = true;
break;
}
}
if (NoofYes == false)
{
MessageBox.Show("用户名或密码不正确!", "错误");
}
else
{
if (this.textBox3.Text == null)
{
MessageBox.Show("新密码不能为空!", "提示");
}
if (this.textBox3.Text != this.textBox4.Text)
{
MessageBox.Show("两次密码输入不相符!", "提示");
}
else
{
XmlDocument doc = new XmlDocument();
XmlNode node;
XmlElement rootNode;
string sSelect;
doc.Load("登陆.xml");
rootNode = doc.DocumentElement;
sSelect = "/Loginlist/user[username='"+textBox1.Text+"']";
node = rootNode.SelectSingleNode(sSelect);
node.ChildNodes[1].InnerText= this.textBox3.Text;
doc.Save("登陆.xml");
MessageBox.Show("修改成功,请重新登陆", "提示");
Login log = new Login();
log.ShowDialog();
this.Hide();
}
我整个的修改密码的代码是这样的。那个xml我是用文本打开的,也不知道为什么有空格,但是用vs2005打开的是没有空格的。
<?xml version="1.0" encoding="utf-8"?>
<!--登陆-->
<LoginList>
<user>
<Username>liujia</Username>
<Password>liujia</Password>
</user>
<user>
<Username>lilu</Username>
<Password>lilu</Password>
</user>
<user>
<Username>zhangsan</Username>
<Password>zhangsan</Password>
</user>
<user>
<Username>lisi</Username>
<Password>lisi</Password>
</user>
</LoginList> --------------------编程问答-------------------- node.ChildNodes[1].InnerText = this.textBox4.Text; //就是这句出错
--------------------编程问答-------------------- sSelect = "/Loginlist/user[username='"+textBox1.Text+"']";
node = rootNode.SelectSingleNode(sSelect);
node.ChildNodes[1].InnerText= this.textBox3.Text;
doc.Save("登陆.xml");
MessageBox.Show("修改成功,请重新登陆", "提示");
Login log = new Login();
log.ShowDialog();
this.Hide();
以上是你部分代码,找出2个问题:
1、Loginlist应为LoginList,username应为Username,注意代码中引用XML文件,要保证大小写一致
2、this.Hide(); 这句很有问题,你把主窗口隐藏了,而其它窗体又不能退出进程,意思就是你的程序运行后,既然窗体一个都看不到了(全关掉),你在任务管理器里还是会看到你的程序的进程在运行 --------------------编程问答-------------------- 用查询:
XPathNavigator nav;
XPathDocument docNav;
XPathNodeIterator NodeIter;
XPathNodeIterator NodeIter1;
String strExpression;
// Open the XML.
docNav = new XPathDocument("Login.xml");
// Create a navigator to query with XPath.
nav = docNav.CreateNavigator();
// 查询密码
strExpression = @"/登录/密码[../姓名='"+UserName+"']";
// Select the node and place the results in an iterator.
NodeIter = nav.Select(strExpression);
UserPwd = NodeIter.Current.Value;
补充:.NET技术 , C#