网络电视精灵思路分析

项目需求

使用C#语言将磁盘上存放的保存频道和频道下对应的节目信息的xml文件通过TreeView控件和DataGridView控件展示出来并提供播放的功能。

练习知识点

  • 动态加载TreeView节点

  • 在C#中解析xml文件的简单操作

  • IO流的简单读写操作

架构搭建

我们知道:“在做一个新的项目之前需要对项目的架构进行搭建,也就是对项目进行详细的设计”

通过对需求的分析“保存的频道和频道下对应的节目信息”我们可以知道我们需要创建两个类-频道类(Channel)和节目类(Program)而他们的具体属性我们可以参考xml文档进行设计。

image

我们可以很明显的从xml文档中抽象出类的属性

  • ChannelType(频道类型)
  • TvChannel(频道名称)
  • Path(频道对应的保存节目信息的xml文档路径)

每个频道下可以有多个节目信息

所以频道对象下还要有一个保存节目对象的集合

节目对象的属性

image

image

我们看到两个频道的xml文档的存储方式都不一样,这是怎么办呢?

我们可以结合两个xml文档抽象出齐全的属性

  • PlayTime(播出时间)
  • Meridien(播出时间段)
  • ProgramName(节目名称)
  • Path(节目的存放路径)

方法的抽象

通过保存节目信息的xml文档路径在频道对象的path属性中保存我们可以在频道类中定义一个解析xml文档的方法。但是两个频道对应的xml文档的保存节目信息的方式并不一样,所以我们可以将Channel中定义抽象方法。并定义两个Channel的子类来对其方法进行重写。

而节目对象则需要有一个播放方法对其进行播放

进过我们的设计可以得到如下的类架构。当然后续也可以根据需求增加类。类图如下:

image

关于工厂类(ChannelTool)

工厂类的作用就是根据程序运行时的需要创建出对应的频道对象

关键代码如下:

public  static List<channels> Load() 
       {
           List<channels> channels = new List<channels>();
           XmlDocument channe = new XmlDocument();
           channe.Load("fils\\FullChannels.xml");
           XmlNode root = channe.DocumentElement;
           foreach (XmlNode item in root.ChildNodes)
           {
               channels cl=null;
               switch (item["channelType"].InnerText)
               {
                   case "TypeA":
                       cl = new TypeAChannel();
                       break;   
                   case "TypeB":
                       cl = new TypeBChannel();
                       break;
                   
               }
               cl.ChannelName = item["tvChannel"].InnerText;
               cl.Type = item["channelType"].InnerText;
               cl.Path = item["path"].InnerText;
               channels.Add(cl);
           }
           return channels;

       }

动态绑定TreeView

绑定TreeView就是将保存频道信息的xml文档解析出来保存在一个集合中,然后遍历整个集合将集合中的每一项转换为TreeView控件的节点对象再通过Nodes.Add()方法将节点对象添加到TreeView控件中。

使用DataGridView显示节目信息

首先将选择的TreeNode对象的Tag属性转化为Channel类型变量(频道对象保存在TreeNode节点的Tag属性中,Text属性保存的是频道名称),调用频道对象的解析节目信息xml的Load()方法给给频道对象的Programs结合变量赋值(programs中保存的是节目对象集合)。使用DataGridView的DataSource属性将频道对象的Programs集合绑定到DataGridView中显示。

频道对象解析xml文档的Load方法的关键代码

public override void Load()
        {
            XmlDocument TypeA = new XmlDocument();
            TypeA.Load(Path);
            XmlNode root = TypeA.DocumentElement;
            XmlNode tvTable = root["tvProgramTable"];
            foreach (XmlNode item in tvTable.ChildNodes)
            {
                TvProgram program = new TvProgram();
                program.PlayTime = item["playTime"].InnerText;
                program.Meridien = item["meridien"].InnerText;
                program.ProgramName = item["programName"].InnerText;
                program.Path = item["path"].InnerText;
                this.Programs.Add(program.PlayTime,program);
            }
        }

上述代码是解析北京电视台对应的xml文档,凤凰卫视的Load方法与此类似,这里不再附上代码!

posted @ 2016-03-08 15:54  王哲(真)  阅读(484)  评论(1编辑  收藏  举报