QQ登录器的分层实现之三(业务实现)‏

前面我们谈到了XML文件的创建和添加数据,其实对XML文件的操作有很多种途径,可以用DataSet,DataTable数据集方式,也可以直接用XmlDocument 对象,还可以用XMLReader,XMLWriter对象来读写,各有所长啊,用什么就看各位的习惯和真实环境了,在这里我们用XmlDocument 对象来直接操作它,可以方便大家了解XML的基本结构,这也是XML操作的基础。我们接着前面的讨论吧。
        如何修改已经添加进来的信息呢?基本思路是:先把文件加载到内存,获取根节点,在根节点下查找需要修改的对象,再做相应的修改InnerText=新内容,看如下代码:
/**//// <summary>
        /// 更新帐号信息
        /// </summary>
        /// <param name="xmlFilePath">系统启动路径</param>
        /// <param name="item">要修改的对象</param>
        public static void UpdateAccount(string xmlFilePath,Account item)
        {
            try
            {
                //获取根节点下的所有子节点
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(xmlFilePath + "data.xml");
                XmlNodeList nodes = xmlDoc.SelectSingleNode("Account").ChildNodes;
                foreach (XmlNode xn in nodes)
                {
                    //判断该节点是否为所要修改的节点
                    if (xn.Name == "Number" && xn.Attributes["ID"].Value == item.Number)
                    {
                        XmlNodeList xnl = xn.ChildNodes;
                        foreach (XmlNode nod in xnl)
                        {
                            switch (nod.Name)
                            {
                                case "Name":
                                    nod.InnerText = item.Name;
                                    break;
                                case "Password":
                                    nod.InnerText = item.Password;
                                    break;
                                case "IsStealth":
                                    nod.InnerText = item.IsStealth.ToString();
                                    break;
                                case "FlashKey":
                                    nod.InnerText = item.FlashKey;
                                    break;
                                case "LastLoginTime":
                                    nod.InnerText = item.LastLoginTime.ToString();
                                    break;
                            }
                        }
                    }
                }
                xmlDoc.Save(xmlFilePath + "data.xml");
            }
            catch (Exception er)
            {

                throw er;
            }
        }
删除操作也大概如此,先把文件加载到内存,获取根节点,在根节点下查找需要删除的对象,我们这里按QQ号码来做关键字。在删除时,子节点是不可以自杀的,要通过他老爸下命令才可以杀。如下所示:
  /**//// <summary>
        /// 删除节点
        /// </summary>
        /// <param name="xmlFilePath">系统启动路径</param>
        /// <param name="items">要删除的对象集合</param>
        public static void DeleteAccount(string xmlFilePath,List<Account> items)
        {
            try
            {
                //获取根节点下的所有子节点
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(xmlFilePath + "data.xml");
                XmlNodeList nodes = xmlDoc.SelectSingleNode("Account").ChildNodes;

                foreach (Account item in items)
                {
                    foreach (XmlNode xn in nodes)
                    {
                        //判断该节点是否为所要删除的节点
                        if (xn.Name == "Number" && xn.Attributes["ID"].Value == item.Number)
                        {
                            //获得该节点的父节点
                            XmlNode parentNode = xn.ParentNode;
                            //删除该节点
                            parentNode.RemoveChild(xn);
                        }
                    }
                }
                //保存文档
                xmlDoc.Save(xmlFilePath + "data.xml");

            }
            catch (Exception er)
            {

                throw er;
            }
        }

查找所有节点,由于我们是用实体类来装载数据,多条数据可以用数据集来存,这里用了泛型List<>
/**//// <summary>
        /// 取得所有节点
        /// </summary>
        /// <returns></returns>
        public static List<Account> GetAllAccount(string xmlFilePath)
        {
            List<Account> accounts = new List<Account>();
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(xmlFilePath + "data.xml");
            XmlNodeList nodes = xmlDoc.SelectSingleNode("Account").ChildNodes;
            foreach (XmlNode xn in nodes)
            {
               
                if (xn.Name == "Number")
                {
                    Account item = new Account();
                    item.Number = xn.Attributes["ID"].Value;
                    XmlElement xe = xn as XmlElement;
                    XmlNodeList xnl = xe.ChildNodes;
                    foreach (XmlNode nod in xnl)
                    {
                        switch (nod.Name)
                        {
                            case "Name":
                                item.Name = nod.InnerText;
                                break;
                            case "Password":
                                item.Password = nod.InnerText;
                                break;
                            case "IsStealth":
                                item.IsStealth = Convert.ToBoolean(nod.InnerText);

                                break;
                            case "FlashKey":
                                item.FlashKey = nod.InnerText;
                                break;
                            case "LastLoginTime":
                                item.LastLoginTime = Convert.ToDateTime(nod.InnerText);
                                break;
                        }
                    }
                    accounts.Add(item);
                }
               
            }
           
            return accounts;
        }
整个XML文件的操作就是这么简单,增删改查,QQ路径也入在了这个文件里面了,对这个节点的操作也是一样的。前面提到QQ密码需要加密才可以正确登录,我们把这个方法也写在这个业务类里面来吧,我们用框架里的MD5来加密吧。
/**//// <summary>
        /// 对密码进行加密
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static  string HashBase64(string str)
        {
            byte[] result = new byte[str.Length];
            try
            {
                MD5 md = new MD5CryptoServiceProvider();
                result = md.ComputeHash(System.Text.Encoding.UTF8.GetBytes(str));
                return Convert.ToBase64String(result);
            }
            catch
            {
                return "";
            }
        }
对于XML文件的操作我们就讨论到这里,欢迎大家提出其他不同的意见,前台页面的编写我们将在下一篇中讨论。谢谢大家的支持!

原文出处:http://www.cnblogs.com/lixg84/