网络电视精灵思路分析
项目需求
使用C#语言将磁盘上存放的保存频道和频道下对应的节目信息的xml文件通过TreeView控件和DataGridView控件展示出来并提供播放的功能。
练习知识点
-
动态加载TreeView节点
-
在C#中解析xml文件的简单操作
-
IO流的简单读写操作
架构搭建
我们知道:“在做一个新的项目之前需要对项目的架构进行搭建,也就是对项目进行详细的设计”
通过对需求的分析“保存的频道和频道下对应的节目信息”我们可以知道我们需要创建两个类-频道类(Channel)和节目类(Program)而他们的具体属性我们可以参考xml文档进行设计。
我们可以很明显的从xml文档中抽象出类的属性
- ChannelType(频道类型)
- TvChannel(频道名称)
- Path(频道对应的保存节目信息的xml文档路径)
每个频道下可以有多个节目信息
所以频道对象下还要有一个保存节目对象的集合
节目对象的属性
我们看到两个频道的xml文档的存储方式都不一样,这是怎么办呢?
我们可以结合两个xml文档抽象出齐全的属性
- PlayTime(播出时间)
- Meridien(播出时间段)
- ProgramName(节目名称)
- Path(节目的存放路径)
方法的抽象
通过保存节目信息的xml文档路径在频道对象的path属性中保存我们可以在频道类中定义一个解析xml文档的方法。但是两个频道对应的xml文档的保存节目信息的方式并不一样,所以我们可以将Channel中定义抽象方法。并定义两个Channel的子类来对其方法进行重写。
而节目对象则需要有一个播放方法对其进行播放
进过我们的设计可以得到如下的类架构。当然后续也可以根据需求增加类。类图如下:
关于工厂类(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方法与此类似,这里不再附上代码!