以前记得用过xml当数据源,觉得很方便,因为有时候,为了演示数据绑定的时候,连接数据库太麻烦,不是每个人,都会去安装一个sqlserver,然后就是配置文件等等,太麻烦
先看xml数据结构
电影院1 成功的道路上1成功说1 mulberry1 成功说2 mulberry2 电影院2 成功的道路上2成功说2 leaf1 成功说 leaf2
要展示的效果为
这个是 Winform程序 电影列表
展示是放在 TreeView 树形图里面的,下面是代码
using System.xml; private void button1_Click(object sender, EventArgs e) { TreeNode tn2, tn3,tn3_2,tn3_3,tn3_4; XmlDataDocument Xd = new XmlDataDocument(); Xd.Load("..\\..\\XMLFile1.xml"); XmlNode rootNode = Xd.DocumentElement; foreach (XmlNode xn1 in rootNode.ChildNodes) { foreach (XmlNode xn2 in xn1.ChildNodes) { if (xn2.Name=="name") { tn2 = treeView1.Nodes.Add(xn2.InnerText); } if (xn2.Name=="address") { tn2.Nodes.Add(xn2.InnerText); tn3 = tn2.Nodes.Add("电影列表");//自定义节点 } if (xn2.Name=="movie") { foreach (XmlNode xn3 in xn2.ChildNodes) { if (xn3.Name=="name") { tn3_2 = tn3.Nodes.Add(xn3.InnerText); //显示在 自定义节点下 } if (xn3.Name=="actor") { tn3_3 = tn3_2.Nodes.Add("演员表"); tn3_3.Nodes.Add(xn3.InnerText); } if (xn3.Name=="time") { tn3_4 = tn3_2.Nodes.Add("放映时间"); tn3_4.Nodes.Add(xn3.InnerText); } } } } } }
自定义节点,自己 想怎么显示都行,好像就是有点麻烦,多层结构,要是有无限层,或许要用到递归
之前还真的而遇到了 要有递归去遍历的情况,那是数据库设计方面的,有关无限极数据库设计,用的是二叉树结构, 左右值 的概念,相关文档
下面是 遍历的代码(WEB),那个表的结构 主键是用的GUID,因为是 有很多级,所有考虑用左右值得方法设计
public partial class zuoyou : System.Web.UI.Page { //guidzz=29be94e8-62d4-497e-bb10-1587455c2fb6 string conStr = ConfigurationManager.ConnectionStrings["New_sy_coreConnectionString"].ConnectionString; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Bind(); if (Request.QueryString["guidzz"]!=null) { getAllMessByGUIDzz(Request.QueryString["guidzz"].ToString()); } } } ////// guidzz 得到站点的guid 有几个站点就有几个GUID /// public void Bind() { //显示下面的所有的信息 //首先显示一下站点的信息 using (DataClasses1DataContext dc = new DataClasses1DataContext(conStr)) { dc.Connection.Open(); string sql = "select Top(5) GUID ,Name from Warehouse"; SqlCommand com = new SqlCommand(sql, dc.Connection as SqlConnection); using (SqlDataReader reader = com.ExecuteReader()) { this.rep_1.DataSource = dc.Translate(reader).ToList(); this.rep_1.DataBind(); } } } //再根据得到的guid 得到这个站点下面的所有的节点信息 public void getAllMessByGUIDzz(string guidzz) { //得到了站点的根目录的ID using (DataClasses1DataContext dc = new DataClasses1DataContext(conStr)) { dc.Connection.Open(); string sql = "select * from Catalog_ViewGetLoadByList where Left_Id=1 and Warehouse_Id='" + guidzz + "' order by ShowOrder"; SqlCommand com = new SqlCommand(sql, dc.Connection as SqlConnection); using (SqlDataReader reader = com.ExecuteReader()) { //得到该站点下面的所有分类 通过左右值确定下来 List list= dc.Translate (reader).ToList(); //先创建树的根节点然后一个一个的去创建 //然后绑定啊 foreach (Catalog_ViewGetLoadByList item in list) { TreeNode tn1 = new TreeNode(jiequString(item.Name),item.GUID); Tree_tv.Nodes.Add(tn1); getRes(tn1, dc); } } } } public string jiequString(string str) { return str.Length > 5 ? str.Substring(0, 5)+"..." : str; } protected void Tree_tv_SelectedNodeChanged(object sender, EventArgs e) { TreeNode tn1 = this.Tree_tv.SelectedNode;//得到当前点击的节点 //查看当前节点的属性 getaa(tn1.Value); } /// /// 递归 查看下面的子节点 /// /// /// private void getRes(TreeNode tn1, DataClasses1DataContext dc) { string sql = "select * from Catalog_ViewGetLoadByList where Parent_Id='" + tn1.Value + "' order by ShowOrder"; SqlCommand com = new SqlCommand(sql, dc.Connection as SqlConnection); using (SqlDataReader reader = com.ExecuteReader()) { Listlist = dc.Translate (reader).ToList(); //先创建树的根节点然后一个一个的去创建 //然后绑定啊 foreach (Catalog_ViewGetLoadByList item in list) { TreeNode tn2 = new TreeNode(jiequString(item.Name), item.GUID); tn1.ChildNodes.Add(tn2); //再去判断这个节点是不是有子节点 getRes( tn2, dc);//看清楚了,这里是递归调用的 } } } // getaa("2748bb6d-2d7d-4c62-ad3b-3a667badadf1"); //得到编号以后 查看属性 public void getaa(string guid) { //补充 查看上级目录的属性 一起放在文件的列表中 using (DataClasses1DataContext dc = new DataClasses1DataContext(conStr)) { dc.Connection.Open(); string sql = string.Format("select * from dbo.Album_Fled where Album_Id in(select Album_Id from Catalog_Album where Catalog_Id in ('{0}'))", guid); SqlCommand com = new SqlCommand(sql, dc.Connection as SqlConnection); using (SqlDataReader reader = com.ExecuteReader()) { List list = dc.Translate (reader).ToList(); this.rep_album.DataSource = list; this.rep_album.DataBind(); } } } }
------------总结------------------------------------------
xml的简单读取,有关于 xml的操作,除了读,当然还有 增 删 改.详细的,去查下文档吧.
另外一个涉及到的就是 数据库的设计;当有很多级的时候,比如物种的分类:界,门,纲,目,科,属,种,
或者是,地区的分级 地球.国家.省.市.街道.村,队,户.人.. 一种解决的办法是 用内联 ,有新的朋友,可以自己去比较一下
最后就是 有关 递归 的思想,遍历二叉树形图的时候,用递归很方便.你要是想用for循环来做....除非你知道,他有多少层....
呵呵,大家一起探讨下,有关于这个 二叉树树形图 吧,数据结构里面从链表 到树形图,相信树形图的应用应该是非常丰富的.