XML 优化项目实践

来源:互联网 发布:类似突袭的电影 知乎 编辑:程序博客网 时间:2024/06/06 08:40

      做系统消息功能时,联系人列表这一块开始是后台查询数据库的方法来绑定TreeView页面控件。外观设计是区划下有部门,部门下面才是联系人的三级节点。由于区划、部门、人员各有一张表,所以在绑定TreeView时,首先查询这三张表,然后根据用户的区划和部门来确定用户的位置,用了三个循环,还有判断语句,在用户量还比较小的时候效率上还可以,但当用户量增加时,效率就有点慢,而且消息功能用的比较频繁,连续的访问数据库,加重了数据库服务器的负担。当系统稳定以后,用户数量也基本确定,就想用其它的方式来优化一下,XML能否解决这个问题?

  先确定XML文档的格式,既然利用生成的XML来绑定TreeView控件,生成的文档最好能不经过逻辑判断来进行绑定TreeView控件。项目实施后,由于用户更新已经比较小,所以就想到在项目应用启动和用户资料更新时,来重新生成用户的XML数据。

 

设计TreeView的三级节点:

区划

    部门

   联系人姓名+区划

 

 

XML生成的文档格式:

<?xml version="1.0" encoding="utf-8"?>
<Linkmans>
  <Area name="区划名称">
    <Department name="部门名称">
      <user fid="用户ID" name="用户姓名" areaname="区划(或自身区划)" />

      ........
    </Department>

  .........
  </Area>

   .........

</Linkmans>

  

 

  完成后没有用测试工具测试,页面反应是快了许多。但是如果用户数据很大,比如超过一万或更多时,这种简单的XML文档生成方式可能就会降低,XmlReader 可以提高读取速度。

 

 

  下面是根据是实现需求的代码:

1 生成XML文档的代码 

 DataSet areaDS = DBAccess.Query(Common.GetConnString, areaSelectSQL);//区划
   DataSet departDS = DBAccess.Query(Common.GetConnString, departSelectSQL);//部门
   DataSet userDS = DBAccess.Query(Common.GetConnString, selectUserSQL);//用户

   string xmlPath = "~//Module//xiaoxi//LinkMan.xml";
   XmlDocument linkmanXMLDoc = new XmlDocument();// 创建XmlDocument对象
   XmlDeclaration xmlDec = linkmanXMLDoc.CreateXmlDeclaration("1.0", "utf-8", null);
   linkmanXMLDoc.AppendChild(xmlDec);
   XmlElement xmlEle = linkmanXMLDoc.CreateElement("Linkmans");//加入一个根元素

   for (int i_ta = 0; i_ta < areaDS.Tables[0].Rows.Count; i_ta++)
    {
         string areaFid = areaDS.Tables[0].Rows[i_ta].ItemArray[0].ToString();

         string areaName = areaDS.Tables[0].Rows[i_ta].ItemArray[1].ToString();// 放区划名称

         XmlElement areaElement = linkmanXMLDoc.CreateElement("Area");    // 创建区划节点
         areaElement.SetAttribute("name", areaName);                      // 设置区划节点的NAME属性

           for (int i_td = 0; i_td < departDS.Tables[0].Rows.Count; i_td++)
             {
               string departFid = departDS.Tables[0].Rows[i_td].ItemArray[0].ToString();

      string departName = departDS.Tables[0].Rows[i_td].ItemArray[1].ToString();// 放部门名称

                    XmlElement departElment = linkmanXMLDoc.CreateElement("Department");
                    departElment.SetAttribute("name", departName);

                    for (int i_ut = 0; i_ut < userDS.Tables[0].Rows.Count; i_ut++)
                    {
                        string userFid = userDS.Tables[0].Rows[i_ut].ItemArray[0].ToString();
                        string userName = userDS.Tables[0].Rows[i_ut].ItemArray[1].ToString();
                        string areaStr = userDS.Tables[0].Rows[i_ut].ItemArray[2].ToString();
                        string departStr = userDS.Tables[0].Rows[i_ut].ItemArray[3].ToString();
                        string areaNewName = userDS.Tables[0].Rows[i_ut].ItemArray[4].ToString();

                        if (areaStr.Equals(areaFid) && departStr.Equals(departFid))
                        {
                            XmlElement userElement = linkmanXMLDoc.CreateElement("user");
                            userElement.SetAttribute("fid", userFid);
                            userElement.SetAttribute("name", userName);
                            userElement.SetAttribute("areaname", areaNewName);

                            departElment.AppendChild(userElement);
                        }
                    }
                    areaElement.AppendChild(departElment);
                }
                xmlEle.AppendChild(areaElement);
            }

            linkmanXMLDoc.AppendChild(xmlEle);

            try
            {
                linkmanXMLDoc.Save(HttpContext.Current.Server.MapPath(xmlPath));//保存
            }
            catch (Exception xmlException)
            {
                Console.WriteLine(xmlException.ToString());
            }

 

2 读取XML文档的代码 

XmlDocument readXMLDoc = new XmlDocument();
string xmlPath = "~//Module//xiaoxi//LinkMan.xml";

            try
            {
                readXMLDoc.Load(HttpContext.Current.Server.MapPath(xmlPath));
            }
            catch (XmlException xmlEx)
            {
                Response.Write(xmlEx.ToString());
            }

            XmlNodeList areaNodeList = readXMLDoc.GetElementsByTagName("Area");

            for (int i = 0; i < areaNodeList.Count; i++)
            {
                string areaName = areaNodeList[i].Attributes["name"].Value;
                TreeNode areaTVNode = new TreeNode(areaName);
                areaTVNode.NavigateUrl = "#";
                addressBookList.Nodes.Add(areaTVNode);

                XmlNodeList departNodeList = areaNodeList[i].ChildNodes;

                foreach (XmlNode departNode in departNodeList)
                {
                    string departName = departNode.Attributes["name"].Value;
                    TreeNode departTVNode = new TreeNode(departName);
                    departTVNode.NavigateUrl = "#";
                    areaTVNode.ChildNodes.Add(departTVNode);

                    XmlNodeList userNodeList = departNode.ChildNodes;

                    foreach (XmlNode userNode in userNodeList)
                    {
                        string userid = userNode.Attributes["fid"].Value;
                        string username = userNode.Attributes["name"].Value;
                        string areaNewName = userNode.Attributes["areaname"].Value;

TreeNode userTVNode = new TreeNode(areaNewName + "_" + username, userid);
userTVNode.NavigateUrl = "javascript:fillReceiver('" + username + "','" + userid + "')";
                        departTVNode.ChildNodes.Add(userTVNode);
                    }
                }
            }