文件读写xml 多层次

本文介绍使用XML作为数据源进行数据绑定的方法,并通过Winform程序实现树形结构的展示。此外,还讨论了数据库设计中无限层级树形结构的实现方式及递归遍历方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 以前记得用过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循环来做....除非你知道,他有多少层....

呵呵,大家一起探讨下,有关于这个 二叉树树形图 吧,数据结构里面从链表 到树形图,相信树形图的应用应该是非常丰富的.

 

 

 

转载于:https://www.cnblogs.com/limiao/archive/2012/07/11/2586972.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值