当前位置:编程学习 > C#/ASP.NET >>

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>

</登陆> --------------------编程问答--------------------
引用 3 楼 yangglemu 的回复:
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)
{}
--------------------编程问答--------------------
引用 5 楼 yangglemu 的回复:
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,所以出错

我照着修改了,但是还是不行。 --------------------编程问答-------------------- 贴出你的XML文件瞧瞧

上面代码我是在VS2008测试通过的 --------------------编程问答--------------------
引用 8 楼 yangglemu 的回复:
贴出你的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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,