C#操作Xml文件:增,删,改,查

新建xml文件–AccountDB.xml
使用xml文件存储页面数据,用与用户登录和用户账号列表的展示


<Root>
  <LoginAccount>
    <Column Name="test" UserGuid="db7e1daa02d17325">
      <UserGuid>db7e1daa02d17325UserGuid>
      <UserName>testUserName>
      <NickName>张三NickName>
      <PassWord>c4ca4238a0b923820dcc509a6f75849bPassWord>
    Column>
    <Column Name="admin" UserGuid="dd2d47215257c963">
      <UserGuid>dd2d47215257c963UserGuid>
      <UserName>adminUserName>
      <NickName>1NickName>
      <PassWord>c4ca4238a0b923820dcc509a6f75849bPassWord>
    Column>
  LoginAccount>
  <AccountList>
    <Column UserGuid="db7e1daa02d17325" AccountID="11">
      <AccountGuid>11AccountGuid>
      <ProductName>360ProductName>
      <AccountNumber>asasasaAccountNumber>
      <PassWord>1111PassWord>
    Column>
    <Column UserGuid="db7e1daa02d17325" AccountID="22">
      <AccountGuid>22AccountGuid>
      <ProductName>sinaProductName>
      <AccountNumber>saewewewAccountNumber>
      <PassWord>1111PassWord>
    Column>
    <Column UserGuid="db7e1daa02d17325" AccountID="333">
      <AccountGuid>333AccountGuid>
      <ProductName>csdnProductName>
      <AccountNumber>fdfdfdfdAccountNumber>
      <PassWord>2222PassWord>
    Column>
    <Column UserGuid="db7e1daa02d17325" AccountID="4444">
      <AccountGuid>4444AccountGuid>
      <ProductName>baiduProductName>
      <AccountNumber>1111AccountNumber>
      <PassWord>1111PassWord>
    Column>
  AccountList>
Root>

新建完成xml文件以后,设置好自定义的格式,xml文件的节点名字可以自定义设置,这是xml文件的优点
在用户登录页面需要查询xml 文件内部用户的值
在获取xml文件之前先获取xml文件的路径,方便读取文件

在web页面读取xml文件路径方法

private static string FilePath = HttpRuntime.AppDomainAppPath + @"AccountDB.xml";

在win窗体程序读取xml文件路径方法

public static string GetFilePath()
{
   DirectoryInfo dir = new DirectoryInfo(Application.StartupPath).Parent.Parent;
   string filePath = dir.FullName + "/AccountDB.xml";
   return filePath;
}
dir.FullName获取的是当前站点的路径

需要添加using System.IO;引用

在操作xml文件内部的数据时,往往直接在xml内部读取数据比较麻烦,现在我们可以将xml文件内部的数据直接转存在自定义的DataTable内,在C#中,操作DataTable往往比xml快的多(个人观点)

在读取上面的AccountDB.xml文件,可以将读取出两张表,我这边只读出用户登录表
在将xml文件数据转换成DataTable之前,我们需要将xml文件中要转换的部分读取出来(不废话,直接贴代码)

//获取当前需要转换的XML  
Public string GetXmlStr()
{
    XmlDocument xmldoc = new XmlDocument();
    xmldoc.Load(GetFilePath());//这里的GetFilePath()是获取当前xml文件的路径我这里是在win窗体程序内应用 web端可以直接调用FilePath 
    string xmlstr = xmldoc.InnerXml;
    int startnum = xmlstr.IndexOf(@"");
    int endnum = xmlstr.IndexOf(@"");
    xmlstr = xmlstr.Substring(startnum, endnum - startnum + 15);//数字15代表的长度
    return xmlstr ;
}

获取到需要转换的xml文件以后,直接将xml文件数据转换成DataTable(这里可以返回DataSet,根据自己的需要)

public static DataTable GetLoginList()
  {
      DataSet xmlDS = new DataSet();
      StringReader stream = null;
      XmlTextReader reader = null;
      try
      {
          string xmlstr = GetXmlStr();
          stream = new StringReader(xmlstr);
          reader = new XmlTextReader(stream);
          xmlDS.ReadXml(reader);
      }
      catch (Exception ex)
      {
          string strTest = ex.Message;
          return null;
      }
      finally
      {
          if (reader != null)
              reader.Close();
      }
      return xmlDS.Tables[0];
  }

在将数据转换成表以后,在登录中只需要在转换出的表中查找就可以了

Public bool Login(string username,string pwd)
{
   bool bl=false;
   DataTable dt=GetLoginList();
   DataRow[] daArr=dt.Select("UserName='"+username+"' AND PassWord='"+pwd.MD5EnCode();+"' ");
   DataTable account=new DataTable();
   account=dt.Copy();
   account.Row.Clear();
   if(daArr.Length>0)
    {
        for (int i = 0; i < daArr.Length; i++)
        {
            account.ImportRow(daArr[i]);
        }
    }
   bl=account.Rows.Count>0;
   return bl;
}

上面说到对xml文件的读取,用户登录完成以后一般新用户也是需要注册滴,在注册新用户时需要在xml写入新的数据,按照xml文件格式插入相应的数据节点
在写入时一样需要读取到当前xml文件并且找到节点,并且在该节点下插入数据节点,直接奉上代码以供参考(不喜勿喷)

public void RegisterAccount(string username,string nickname,string pwd)
{
   string xmlurl=GetFilePath();
   XmlDocument xmldoc = new XmlDocument();
   xmldoc.Load(xmlurl);
   XmlNode root = xmldoc.SelectSingleNode("Root");//查找节点
   XmlNode loginaccount = root.SelectSingleNode("LoginAccount"); //查找节点
   XmlElement col = xmldoc.CreateElement("Column");//创建一个节点
   col.SetAttribute("Name", username);

   string guid="";//主键Guid自动生成,这里可根据用户需要设置(获取Guid方法可以私信我)
   XmlElement userguid = xmldoc.CreateElement("UserGuid"); //创建子节点
   userguid.InnerText = guid; //设置节点值
   col.AppendChild(userguid);//添加到节点

   XmlElement name = xmldoc.CreateElement("UserName"); //创建子节点
   name.InnerText = username; //设置节点值
   col.AppendChild(name);//添加到节点

   XmlElement nick = xmldoc.CreateElement("NickName"); //创建子节点
   nick.InnerText = nickname; //设置节点值
   col.AppendChild(nick);//添加到节点

   XmlElement password = xmldoc.CreateElement("PassWord"); //创建子节点
   password.InnerText = pwd.MD5EnCode(); //设置节点值
   col.AppendChild(password);//添加到节点

   loginaccount.AppendChild(col); //将节点添加到节点

   xmldoc.Save(xmlurl);//保存当前xml文件
}

在插入数据之前可以添加一个小方法,验证当前添加的数据是否存在

public bool CheckUser(string username)
 {
     bool bl = true;
     XmlDocument xmldoc = new XmlDocument();
     xmldoc.Load(WinHelp.GetFilePath());
     XmlNode root = xmldoc.SelectSingleNode("Root");//查找节点
     XmlNode loginaccount = root.SelectSingleNode("LoginAccount"); //查找节点
     XmlNodeList columnlist = loginaccount.SelectNodes("Column");
     foreach (XmlNode colunm in columnlist)
     {
         XmlElement xm = (XmlElement)colunm;
         if (xm.GetAttribute("Name") == username)
         {
             bl = false;
         }
     }
     return bl;
 }

在用户修改密码时需要对当前用户数据在xml里面进行修改,就需要对Xml文件进行操作
这里演示用户修改密码

 public void UpdateAccount(string oldpwd,string newpwd,string accountguid)
 {
    string xmlurl=GetFilePath();
    XmlDocument xmldoc = new XmlDocument();
    xmldoc.Load(xmlurl);
    XmlNode root = xmldoc.SelectSingleNode("Root");//查找节点
    XmlNode loginaccount = root.SelectSingleNode("LoginAccount"); //查找节点
    XmlNodeList columnlist = loginaccount.SelectNodes("Column");
    foreach (XmlNode colunm in columnlist)
    {
      XmlElement xm = (XmlElement)colunm;
       if (xm.GetAttribute("UserGuid") == accountguid)
       {
           XmlNodeList conxm = xm.ChildNodes;
           foreach (XmlNode item in conxm)
           {

               XmlElement itxe = (XmlElement)item;
               string name = itxe.Name;
               if(name=="PassWord")
               {
                  if(itxe.InnerText==old.MD5EnCode())
                  {
                    itxe.InnerText = newpwd.MD5EnCode();
                  }
               }
           }
       }
    }
    xmldoc.Save(xmlurl);
 }

在用户管理时,系统管理员可以将指定的用户删除,这就需要对xml节点进行删除,删除xml节点并保存

private void DelAccount(string accountguid)
 {
     string xmlurl = GetFilePath();
     XmlDocument xmldoc = new XmlDocument();
     xmldoc.Load(xmlurl);
     XmlNode root = xmldoc.SelectSingleNode("Root");//查找节点
     XmlNode loginaccount = root.SelectSingleNode("LoginAccount"); //查找节点
     XmlNodeList columnlist = loginaccount.SelectNodes("Column");
     foreach (XmlNode colunm in columnlist)
     {
         XmlElement xm = (XmlElement)colunm;
         if (xm.GetAttribute("UserGuid") == accountguid)
         {
              XmlElement colxml = (XmlElement)loginaccount;
              colxml.RemoveChild(colunm);//移除掉节点下指定的子节点
         }
     }
     xmldoc.Save(xmlurl);
 }

上面在用户登录,用户注册 ,密码修改,用户管理等各使用到的是对xml文件的查询,新增 ,修改,删除,等基本操作,以上代码个人亲测通过,基本上是copy以后可以直接使用,如有疑问可以私信我,不喜勿喷,
源代码已上传,有需要可以下载http://download.csdn.net/detail/shechaojin/9502916

你可能感兴趣的:(C#)