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;
}
}
/// <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;
}
/// <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 "";
}
}


浙公网安备 33010602011771号