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文件的操作我们就讨论到这里,欢迎大家提出其他不同的意见,前台页面的编写我们将在下一篇中讨论。谢谢大家的支持!

posted on 2008-04-29 12:54  [刚子]  阅读(1935)  评论(12)    收藏  举报

导航