以前记得用过xml当数据源,觉得很方便,因为有时候,为了演示数据绑定的时候,连接数据库太麻烦,不是每个人,都会去安装一个sqlserver,然后就是配置文件等等,太麻烦
先看xml数据结构
<?xml version="1.0" encoding="utf-8" ?> <root> <cnimal> <name>电影院1</name> <address>成功的道路上1</address> <movie> <name>成功说1</name> <actor>mulberry1</actor> <time>now</time> </movie> <movie> <name>成功说2</name> <actor>mulberry2</actor> <time>now</time> </movie> </cnimal> <cnimal> <name>电影院2</name> <address>成功的道路上2</address> <movie> <name>成功说2</name> <actor>leaf1</actor> <time>now</time> </movie> <movie> <name>成功说</name> <actor>leaf2</actor> <time>now</time> </movie> </cnimal> </root>
要展示的效果为
这个是 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); } } } } } }
自定义节点,自己 想怎么显示都行,好像就是有点麻烦,多层结构,要是有无限层,或许要用到递归
之前还真的而遇到了 要有递归去遍历的情况,那是数据库设计方面的,有关无限极数据库设计,用的是二叉树结构, 左右值 的概念,相关文档
http://wenku.baidu.com/view/cb2bb3eeaeaad1f346933ffd.html
下面是 遍历的代码(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()); } } } /// <summary> /// guidzz 得到站点的guid 有几个站点就有几个GUID /// </summary> 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<Catalog_ViewGetLoadByList>(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<Catalog_ViewGetLoadByList>list= dc.Translate<Catalog_ViewGetLoadByList>(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); } /// <summary> /// 递归 查看下面的子节点 /// </summary> /// <param name="tn1"></param> /// <param name="dc"></param> 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()) { List<Catalog_ViewGetLoadByList> list = dc.Translate<Catalog_ViewGetLoadByList>(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<Album_Fled> list = dc.Translate<Album_Fled>(reader).ToList(); this.rep_album.DataSource = list; this.rep_album.DataBind(); } } } }
------------总结------------------------------------------
xml的简单读取,有关于 xml的操作,除了读,当然还有 增 删 改.详细的,去查下文档吧.
另外一个涉及到的就是 数据库的设计;当有很多级的时候,比如物种的分类:界,门,纲,目,科,属,种,
或者是,地区的分级 地球.国家.省.市.街道.村,队,户.人.. 一种解决的办法是 用内联 ,有新的朋友,可以自己去比较一下
最后就是 有关 递归 的思想,遍历二叉树形图的时候,用递归很方便.你要是想用for循环来做....除非你知道,他有多少层....
呵呵,大家一起探讨下,有关于这个 二叉树树形图 吧,数据结构里面从链表 到树形图,相信树形图的应用应该是非常丰富的.
/*******************************
****创建人:紫樱桑
****备注:;欢迎转载,以及提出宝贵的意见
****本人才疏学浅,愿共同探讨
********************************/