一种从数据库利用xml创建树型目录的方法(C#)
点击次数:19 次 发布日期:2008-11-26 10:57:01 作者:源代码网
|
源代码网推荐 引言: 源代码网推荐 源代码网推荐 无线项目开发中,项目需求要对无线的服务项目追加额外参数,所以需要解析那边的xml数据(如何获得xml数据我已经在其它的文章中写过了),然后再按照一定的规律存到本地库(无线那边提供的xml数据需要通过一定的转化过程才能得到我们想要的东西)并重新构造一个xml树型目录出来。本文便要提供一种简便的方法实现从数据库生成xml文档,进而用xslt解析成树型目录的方案。 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 设计方案: 源代码网推荐 源代码网推荐 一、数据库 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 Mobile_ServiceType 服务类型 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 Field 源代码网推荐 源代码网推荐 源代码网推荐 DataType 源代码网推荐 源代码网推荐 源代码网推荐 Default 源代码网推荐 源代码网推荐 源代码网推荐 Description 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 ServiceTypeID 源代码网推荐 int 源代码网推荐 Identity 源代码网推荐 ID 源代码网推荐 源代码网推荐 ParentID 源代码网推荐 Int 源代码网推荐 0 源代码网推荐 父类型ID 源代码网推荐 源代码网推荐 MetoneServiceTypeID 源代码网推荐 Int 源代码网推荐 0 源代码网推荐 类型ID 源代码网推荐 源代码网推荐 ServiceTypeName 源代码网推荐 int 源代码网推荐 0 源代码网推荐 服务类型名称 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 一点说明:这个表存放的是服务类型名称及类型之间的关系的,MetoneServiceTypeID是当前信息的ID,这里没有使用ServiceTypeID 作为当前节点的ID是因为当前节点ID是不可以随便改变的,而且这个ID决定了收费标准,所以独立设定此字段的,不过从技术层面来讲设置谁为当前节点并没有什么不同,ParentID是类型的父类型ID。 源代码网推荐 源代码网推荐 二、存储过程: 源代码网推荐 源代码网推荐 /********************************** 源代码网推荐 源代码网推荐 功能:根据一定条件读取类型记录 源代码网推荐 源代码网推荐 作者:Rexsp 源代码网推荐 源代码网推荐 创建日期:2004-03-24 源代码网推荐 源代码网推荐 修改者: 源代码网推荐 源代码网推荐 修改日期: 源代码网推荐 源代码网推荐 **********************************/ 源代码网推荐 源代码网推荐 ALTER PROCEDURE GetMobileServiceType 源代码网推荐 源代码网推荐 ( 源代码网推荐 源代码网推荐 @Action NVARCHAR(20)="Complex", 源代码网推荐 源代码网推荐 @ServiceTypeID INT=-1, 源代码网推荐 源代码网推荐 @ServiceTypeName NVARCHAR(50)=null, 源代码网推荐 源代码网推荐 @MetoneServiceTypeID INT=-1, 源代码网推荐 源代码网推荐 @ParentID INT=-1 源代码网推荐 源代码网推荐 ) 源代码网推荐 源代码网推荐 AS 源代码网推荐 源代码网推荐 SET NOCOUNT ON 源代码网推荐 源代码网推荐 IF(@Action="Complex") 源代码网推荐 源代码网推荐 BEGIN 源代码网推荐 源代码网推荐 --省略N行与本篇无关的代码 源代码网推荐 源代码网推荐 END 源代码网推荐 源代码网推荐 IF(@Action="GetTree") 源代码网推荐 源代码网推荐 BEGIN 源代码网推荐 源代码网推荐 SELECT 源代码网推荐 源代码网推荐 MetoneServiceTypeID, 源代码网推荐 源代码网推荐 ServiceTypeName, 源代码网推荐 源代码网推荐 ParentID, 源代码网推荐 源代码网推荐 URL="MobileSetting.aspx?ID="+CAST(MetoneServiceTypeID AS NVARCHAR(4)) 源代码网推荐 源代码网推荐 FROM [Mobile_ServiceType] 源代码网推荐 源代码网推荐 END 源代码网推荐 源代码网推荐 一点解释:存储过程有两部分,前半部分是为了一个复杂查询设计的,后面的是构建xml树设置的。这里是通过一个@Actoin变量来控制跳入哪个部分的,另外这里的代码我简化处理了,真实环境中会根据另外一个表的设置来动态生成不同的xml树的。 源代码网推荐 源代码网推荐 三、COM层代码就列了,总体层次是三层架构,这我在专栏中也有提过。这里只给出几个相关的COM层类的接口和功能说明。 源代码网推荐 源代码网推荐 MobileServiceTypeCollection提供各种搜索条件得出的数据集,里面有一个方法,返回一个DataSet,调用的SP就是上面提供的那个: 源代码网推荐 源代码网推荐 /// 源代码网推荐 源代码网推荐 /// 获取生成美类型列表相关数据 源代码网推荐 源代码网推荐 /// 源代码网推荐 源代码网推荐 /// 类型列表数据集 源代码网推荐 源代码网推荐 /// 成功返回true,失败返回false; 源代码网推荐 源代码网推荐 public bool GetMetoneTree(out DataSet dataSet) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 //创建Adapter对象 源代码网推荐 源代码网推荐 SqlDataAdapter dataAdapter = null; 源代码网推荐 源代码网推荐 //创建data对象和params 源代码网推荐 源代码网推荐 Database data = new Database("Town"); 源代码网推荐 源代码网推荐 SqlParameter[] prams ={data.MakeInParam("@Action",SqlDbType.NVarChar,20,"GetTree")}; 源代码网推荐 源代码网推荐 try 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 data.RunProc("GetMobileServiceType", prams, out dataAdapter); 源代码网推荐 源代码网推荐 dataSet = new DataSet(); 源代码网推荐 源代码网推荐 dataAdapter.Fill(dataSet,"Tree"); 源代码网推荐 源代码网推荐 dataAdapter.Dispose(); 源代码网推荐 源代码网推荐 return true; 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 catch (Exception ex) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 dataSet = null; 源代码网推荐 源代码网推荐 Error.Log("Town", ex.ToString()); 源代码网推荐 源代码网推荐 return false; 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 finally 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 dataAdapter.Dispose(); 源代码网推荐 源代码网推荐 data.Close(); 源代码网推荐 源代码网推荐 data.Dispose(); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 四、UI层处理: 源代码网推荐 源代码网推荐 #region 重新生成手机服务栏目列表XML 源代码网推荐 源代码网推荐 private void CreateMetoneTree() 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 xmlDoc_Metone = new XmlDocument(); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 new Town.Com.MobileServiceTypeCollection().GetMetoneTree(out ds); 源代码网推荐 源代码网推荐 //生成根节点 源代码网推荐 源代码网推荐 XmlElement treeContentElement = xmlDoc_Metone.CreateElement("NewDataSet"); 源代码网推荐 源代码网推荐 xmlDoc_Metone.AppendChild(treeContentElement); 源代码网推荐 源代码网推荐 //递归生成频道的XML文档 源代码网推荐 源代码网推荐 for(int j=0;j 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 if(Int32.Parse(ds.Tables["Tree"].Rows[j].ItemArray[2].ToString()) == 0) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 this.BulidXmlTree(treeContentElement,j); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 else 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 continue; 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 string fileName = Server.MapPath("Xml/MetoneTree.xml"); 源代码网推荐 源代码网推荐 xmlDoc_Metone.Save(fileName); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 #endregion 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 #region 构XML树 源代码网推荐 源代码网推荐 private void BulidXmlTree(XmlElement tempXmlElement,int location) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 DataRow tempRow = ds.Tables["Tree"].Rows[location]; 源代码网推荐 源代码网推荐 //生成Tree节点 源代码网推荐 源代码网推荐 XmlElement treeElement = xmlDoc_Metone.CreateElement("Tree"); 源代码网推荐 源代码网推荐 tempXmlElement.AppendChild(treeElement); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 this.AppendChildElement("MetoneID",tempRow.ItemArray[0].ToString(),treeElement); 源代码网推荐 源代码网推荐 this.AppendChildElement("MetoneName",tempRow.ItemArray[1].ToString(),treeElement); 源代码网推荐 源代码网推荐 this.AppendChildElement("ParentMetoneID",tempRow.ItemArray[2].ToString(),treeElement); 源代码网推荐 源代码网推荐 this.AppendChildElement("MetoneUrl",tempRow.ItemArray[3].ToString(),treeElement); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 for(int i=0 ; i < ds.Tables["Tree"].Rows.Count;i++) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 if(ds.Tables["Tree"].Rows[i].ItemArray[2].ToString() == tempRow.ItemArray[0].ToString()) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 this.BulidXmlTree(treeElement,i); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 #endregion 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 #region 追加子节点 源代码网推荐 源代码网推荐 /// 源代码网推荐 源代码网推荐 /// 追加子节点 源代码网推荐 源代码网推荐 /// 源代码网推荐 源代码网推荐 /// 节点名字 源代码网推荐 源代码网推荐 /// 节点内容 源代码网推荐 源代码网推荐 /// 父节点 源代码网推荐 源代码网推荐 /// XmlDocument对象 源代码网推荐 源代码网推荐 private void AppendChildElement(string strName , string strInnerText , XmlElement parentElement, XmlDocument xmlDocument ) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 XmlElement xmlElement = xmlDocument.CreateElement(strName) ; 源代码网推荐 源代码网推荐 xmlElement.InnerText = strInnerText ; 源代码网推荐 源代码网推荐 parentElement.AppendChild(xmlElement); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 /// 源代码网推荐 源代码网推荐 /// 使用默认的频道Xml文档 源代码网推荐 源代码网推荐 /// 源代码网推荐 源代码网推荐 /// 源代码网推荐 源代码网推荐 /// 源代码网推荐 源代码网推荐 /// 源代码网推荐 源代码网推荐 private void AppendChildElement(string strName , string strInnerText , XmlElement parentElement ) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 AppendChildElement(strName,strInnerText,parentElement,xmlDoc_Metone); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 #endregion 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 一点说明:感觉这些代码基本上都是自解释的,关键点都有注释,看看就明白的。 源代码网推荐 源代码网推荐 五、解析xml的xslt 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 selectedEntity = "";clickOnEntity(this);redirect(""); 源代码网推荐 源代码网推荐 false 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 display: none; 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 cursor: hand; 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 六、一个小技巧:用js把xml的数据用xslt解析后填充到固定的html块中,比如div,调用代码:initAdmin("MetoneTree.xml", "submenu","MetoneTree.xslt"),js代码如下: 源代码网推荐 源代码网推荐 var view;//中英文版本切换 源代码网推荐 源代码网推荐 var xmlDoc;//MSXML2.DOM对象 源代码网推荐 源代码网推荐 var selectedEntity;//选中接点ID号 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 function initAdmin(fileName, divTree,xsltFile, expID)//初始化树状结构 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 var xslDoc; 源代码网推荐 源代码网推荐 var strXml; 源代码网推荐 源代码网推荐 var objXml; 源代码网推荐 源代码网推荐 var xmlHttp; 源代码网推荐 源代码网推荐 var xslProc; 源代码网推荐 源代码网推荐 var xslTemplate; 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 //alert(fileName); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 xmlDoc = new ActiveXObject("MSXML2.DOMDocument"); 源代码网推荐 源代码网推荐 xmlDoc.async = false; 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 xslDoc = new ActiveXObject("MSXML2.FreeThreadedDOMDocument"); 源代码网推荐 源代码网推荐 xslDoc.async = false; 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 xmlDoc.load("XML/"+fileName); 源代码网推荐 源代码网推荐 xslDoc.load("XSLT/"+xsltFile); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 xslTemplate = new ActiveXObject("MSXML2.XSLTemplate"); 源代码网推荐 源代码网推荐 xslTemplate.stylesheet = xslDoc; 源代码网推荐 源代码网推荐 xslProc = xslTemplate.createProcessor(); 源代码网推荐 源代码网推荐 xslProc.input = xmlDoc; 源代码网推荐 源代码网推荐 xslProc.transform(); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 document.all[divTree].innerHTML = xslProc.output; 源代码网推荐 源代码网推荐 if(expID != null) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 expandSome(document.all[expID]); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 七、如果有不明白的msn上提问好了,msn:yubo@x263.net,文中要有疏漏之处请多指教。 源代码网推荐 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
