解析XML文件,并将信息显示在窗体上
- 仔细观察如下窗口及world.xml文件:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <World> 3 <Person> 4 <Id>101</Id> 5 <Name>刘德华</Name> 6 <Sex>男</Sex> 7 <Age>45</Age> 8 </Person> 9 <Person> 10 <Id>102</Id> 11 <Name>章子怡</Name> 12 <Sex>女</Sex> 13 <Age>35</Age> 14 </Person> 15 <Student> 16 <Id>201</Id> 17 <Name>周杰伦</Name> 18 <Sex>男</Sex> 19 <Age>25</Age> 20 <Favor>双节棍</Favor> 21 </Student> 22 <Student> 23 <Id>202</Id> 24 <Name>梅梅</Name> 25 <Sex>女</Sex> 26 <Age>17</Age> 27 <Favor>冰淇淋</Favor> 28 </Student> 29 <Teacher> 30 <Id>301</Id> 31 <Name>刘老根</Name> 32 <Sex>男</Sex> 33 <Age>60</Age> 34 <Year>30</Year> 35 </Teacher> 36 <Teacher> 37 <Id>302</Id> 38 <Name>药匣子</Name> 39 <Sex>男</Sex> 40 <Age>55</Age> 41 <Year>25</Year> 42 </Teacher> 43 </World>
- 完成以下功能:
2.1. 设计性别枚举Sex。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace FrmPerson 7 { 8 #region 性别枚举 9 10 /// <summary> 11 /// 性别枚举 12 /// </summary> 13 public enum Sex 14 { 15 男, 女 16 } 17 #endregion 18 }
2.2. 设计人类Person。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace FrmPerson 7 { 8 /// <summary> 9 /// 人类(抽象类) 10 /// </summary> 11 public abstract class Person 12 { 13 14 #region 属性 15 16 /// <summary> 17 /// 编号 18 /// </summary> 19 public string Id { get; set; } 20 21 /// <summary> 22 /// 姓名 23 /// </summary> 24 public string Name { get; set; } 25 26 /// <summary> 27 /// 性别 28 /// </summary> 29 public Sex Sex { get; set; } 30 31 /// <summary> 32 /// 年龄 33 /// </summary> 34 public int Age { get; set; } 35 36 /// <summary> 37 /// 爱好 38 /// </summary> 39 public string Favor { get; set; } 40 41 /// <summary> 42 /// 教龄 43 /// </summary> 44 public string Year { get; set; } 45 46 #endregion 47 48 #region 抽象方法 49 50 /// <summary> 51 /// 抽象方法 52 /// </summary> 53 /// <param name="personList">Person集合</param> 54 public abstract void InitPersonList(List<Person> personList); 55 #endregion 56 57 } 58 }
2.3. 设计学生类Student,继承Person类。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Xml; 6 7 namespace FrmPerson 8 { 9 /// <summary> 10 /// 学生类 11 /// </summary> 12 public class Student:Person 13 { 14 #region 实现父类的抽象方法,解析XML文件 15 16 /// <summary> 17 /// 解析XML文件,并将解析后的对象添加到集合中 18 /// </summary> 19 /// <param name="personList">Person集合</param> 20 public override void InitPersonList(List<Person> personList) 21 { 22 try 23 { 24 XmlDocument xmlDoc = new XmlDocument(); 25 xmlDoc.Load("World.xml"); 26 XmlNodeList xmlNodeList = xmlDoc.GetElementsByTagName("Student"); 27 foreach (XmlNode node in xmlNodeList) 28 { 29 //通过简单工厂,根据类型创建对象 30 Person per = PersonFactory.GetPerson("Student"); 31 per.Id = node["Id"].InnerText; 32 per.Name = node["Name"].InnerText; 33 per.Sex = (Sex)Enum.Parse(typeof(Sex), node["Sex"].InnerText); 34 per.Age = Convert.ToInt32(node["Age"].InnerText); 35 per.Favor = node["Favor"].InnerText; 36 per.Year = "无"; 37 personList.Add(per); 38 } 39 } 40 catch(Exception ex) 41 { 42 43 throw new Exception("文件加载错误!"+ex.Message); 44 } 45 } 46 #endregion 47 } 48 }
2.4. 设计教师类Teacher,继承Person类。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Xml; 6 7 namespace FrmPerson 8 { 9 public class Teacher:Person 10 { 11 #region 实现父类的抽象方法,解析XML文件 12 13 /// <summary> 14 /// 解析XML文件,并将解析后的对象添加到集合中 15 /// </summary> 16 /// <param name="personList">Person集合</param> 17 public override void InitPersonList(List<Person> personList) 18 { 19 try 20 { 21 XmlDocument xmlDoc = new XmlDocument(); 22 xmlDoc.Load("World.xml"); 23 XmlNodeList xlmNodeList = xmlDoc.GetElementsByTagName("Teacher"); 24 foreach (XmlNode node in xlmNodeList) 25 { 26 //通过简单工厂,根据类型创建对象 27 Person per = PersonFactory.GetPerson("Teacher"); 28 per.Id = node["Id"].InnerText; 29 per.Name = node["Name"].InnerText; 30 per.Sex = (Sex)Enum.Parse(typeof(Sex), node["Sex"].InnerText); 31 per.Age = Convert.ToInt32(node["Age"].InnerText); 32 per.Favor = "无"; 33 per.Year = node["Year"].InnerText; 34 personList.Add(per); 35 } 36 } 37 catch(Exception ex) 38 { 39 40 throw new Exception("文件加载错误!"+ex.Message); 41 } 42 } 43 #endregion 44 } 45 }
2.5. 设计Person类Actor,继承Person类。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Xml; 6 7 namespace FrmPerson 8 { 9 /// <summary> 10 /// Person类 11 /// </summary> 12 public class Actor:Person 13 { 14 15 #region 实现父类的抽象方法,解析XML文件 16 17 /// <summary> 18 /// 解析XML文件,并将解析后的对象添加到集合中 19 /// </summary> 20 /// <param name="personList">Person集合</param> 21 public override void InitPersonList(List<Person> personList) 22 { 23 try 24 { 25 26 XmlDocument xmlDoc = new XmlDocument(); 27 xmlDoc.Load("World.xml"); 28 XmlNodeList xmlNodeList = xmlDoc.GetElementsByTagName("Person"); 29 foreach (XmlNode node in xmlNodeList) 30 { 31 //通过简单工厂,根据类型创建对象 32 Person per = PersonFactory.GetPerson("Person"); 33 per.Id = node["Id"].InnerText; 34 per.Name = node["Name"].InnerText; 35 per.Sex = (Sex)Enum.Parse(typeof(Sex), node["Sex"].InnerText); 36 per.Age = Convert.ToInt32(node["Age"].InnerText); 37 per.Favor = "无"; 38 per.Year = "无"; 39 personList.Add(per); 40 } 41 } 42 catch(Exception ex) 43 { 44 45 throw new Exception("数据加载错误!"+ex.Message); 46 } 47 } 48 #endregion 49 } 50 }
2.6. 设计简单工厂PersonFactory,创建各个对象。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace FrmPerson 7 { 8 /// <summary> 9 /// 工厂类,用于实例化对象 10 /// </summary> 11 public class PersonFactory 12 { 13 #region 实例化Person对象 14 15 /// <summary> 16 /// 实例化Person对象,并返回 17 /// </summary> 18 /// <param name="type">要实例化的类型</param> 19 /// <returns>返回实例化的对象</returns> 20 public static Person GetPerson(string type) 21 { 22 Person per = null; 23 switch (type) 24 { 25 case "Person": 26 per = new Actor(); break; 27 case "Student": 28 per = new Student(); break; 29 case "Teacher": 30 per = new Teacher(); break; 31 default: 32 break; 33 } 34 return per; 35 } 36 #endregion 37 } 38 }
2.7. 创建全局集合persons,用于保存全部对象。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Xml; 6 7 namespace FrmPerson 8 { 9 /// <summary> 10 /// Person管理类,用于初始化Person信息 11 /// </summary> 12 public class PersonManage 13 { 14 15 #region 无参构造 16 17 /// <summary> 18 /// 构造函数,用于实例化Person集合 19 /// </summary> 20 public PersonManage() 21 { 22 Persons = new List<Person>(); 23 } 24 #endregion 25 26 #region Person集合属性 27 28 /// <summary> 29 /// Person集合 30 /// </summary> 31 public List<Person> Persons { get; set; } 32 #endregion 33 34 #region 初始化Person集合 35 36 /// <summary> 37 /// 初始化Person集合 38 /// </summary> 39 public void InitPerson() 40 { 41 this.Persons.Clear(); //清空集合 42 try 43 { 44 XmlDocument xmlDoc = new XmlDocument(); 45 xmlDoc.Load("World.xml"); 46 XmlNode parensNode = xmlDoc.DocumentElement; 47 string name = null; 48 foreach (XmlNode personNode in parensNode.ChildNodes) 49 { 50 //加载的类型重复的话跳过 51 if (name == personNode.Name) 52 { 53 continue; 54 } 55 name = personNode.Name; 56 Person per = PersonFactory.GetPerson(name); 57 per.InitPersonList(Persons); 58 } 59 } 60 catch(Exception ex) 61 { 62 throw new Exception("文件加载错误!"+ex.Message); 63 } 64 } 65 #endregion 66 67 } 68 }
2.8. 窗体加载时读取World.xml文件,并创建所有对象存入persons集合。
2.9. 窗体加载时将persons集合信息显示在ListView控件上。
- 事件处理:
3.1. 点击ListView中的一项,在文本框中显示该项内容。
3.2. 点击“首条”、“前条”、“后条”、“尾条”按钮,可以从当前显示位置翻看集合中的相应对象内容。
- 打印功能:
4.1. 在硬盘上保存Persons.txt文本文件。内容格式如下:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.IO; 10 11 namespace FrmPerson 12 { 13 public partial class FrmPerson : Form 14 { 15 public FrmPerson() 16 { 17 InitializeComponent(); 18 } 19 20 PersonManage pm = new PersonManage(); //Person管理对象 21 int index = 0; //用于设置集合下标 22 23 #region 窗体加载,初始化Person信息,并且在ListView上显示人员信息 24 25 private void FrmPerson_Load(object sender, EventArgs e) 26 { 27 try 28 { 29 pm.InitPerson(); 30 BinLvPerson(); 31 } 32 catch (Exception ex) 33 { 34 MessageBox.Show(ex.Message); 35 } 36 } 37 #endregion 38 39 40 #region 将数据显示在ListView控件上的方法 41 /// <summary> 42 /// 绑定ListView控件 43 /// </summary> 44 private void BinLvPerson() 45 { 46 foreach (Person per in pm.Persons) 47 { 48 ListViewItem item = new ListViewItem(); 49 item.Text = per.Id; 50 item.SubItems.AddRange(new string[] { per.Name, per.Sex.ToString(), per.Age.ToString(), per.Favor, per.Year.ToString() }); 51 lvPerson.Items.Add(item); 52 } 53 } 54 #endregion 55 56 57 #region 在文本框中显示ListView控件中选中的行 58 59 private void lvPerson_Click(object sender, EventArgs e) 60 { 61 index = this.lvPerson.SelectedItems[0].Index; 62 ShowPerson(index); 63 } 64 65 #endregion 66 67 68 #region 文本框显示Person信息的方法 69 70 /// <summary> 71 /// 文本框显示Person信息的方法 72 /// </summary> 73 /// <param name="index">要显示的集合元素的下标</param> 74 private void ShowPerson(int index) 75 { 76 if (pm.Persons.Count==0) 77 { 78 return; 79 } 80 Person per = pm.Persons[index]; 81 this.txtNo.Text = per.Id; 82 this.txtName.Text = per.Name; 83 this.txtSex.Text = per.Sex.ToString(); 84 this.txtAge.Text = per.Age.ToString(); 85 this.txthobby.Text = per.Favor; 86 this.txtSchoolAge.Text = per.Year; 87 } 88 89 #endregion 90 91 92 #region 点击按钮在文本框中显示Person信息 93 94 private void btn_Click(object sender, EventArgs e) 95 { 96 Button btn = (Button)sender; 97 switch (btn.Text) 98 { 99 case "首条": 100 index = 0; 101 break; 102 case "前条": 103 104 if (index <= 0) 105 { 106 MessageBox.Show("已经是第一条了!"); 107 return; 108 } 109 index--; 110 break; 111 case "后条": 112 113 if (index >= pm.Persons.Count - 1) 114 { 115 MessageBox.Show("已经是最后一条了!"); 116 return; 117 } 118 index++; 119 break; 120 case "尾条": 121 index = pm.Persons.Count - 1; 122 break; 123 } 124 ShowPerson(index); 125 } 126 #endregion 127 128 129 #region 打印信息 130 131 private void btnPrint_Click(object sender, EventArgs e) 132 { 133 StreamWriter sw = new StreamWriter("PersonInfo.txt"); 134 sw.WriteLine("--------人员清单--------"); 135 foreach (Person per in pm.Persons) 136 { 137 sw.WriteLine("姓名:{0}" , per.Name); 138 sw.WriteLine("性别:{0}", per.Sex); 139 sw.WriteLine("年龄:{0}", per.Age); 140 sw.WriteLine("爱好:{0}", per.Favor); 141 sw.WriteLine("教龄:{0}", per.Year); 142 sw.WriteLine("------------"); 143 } 144 sw.Close(); 145 MessageBox.Show("打印成功!"); 146 } 147 #endregion 148 149 150 #region 退出程序 151 152 private void btnExit_Click(object sender, EventArgs e) 153 { 154 DialogResult dr=MessageBox.Show("确定要退出吗?","操作提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question); 155 if (dr==DialogResult.OK) 156 { 157 Application.Exit(); 158 } 159 } 160 #endregion 161 } 162 }
--------人员清单--------
姓名:刘德华
性别:男
年龄:45
爱好:无
教龄:无
------------
姓名:章子怡
性别:女
年龄:35
爱好:无
教龄:无
------------
姓名:周杰伦
性别:男
年龄:25
爱好:双节棍
教龄:无
------------
姓名:梅梅
性别:女
年龄:17
爱好:冰淇淋
教龄:无
------------
姓名:刘老根
性别:男
年龄:60
爱好:无
教龄:30
------------
姓名:药匣子
性别:男
年龄:55
爱好:无
教龄:25
------------
- 程序要求:
5.1. 对独立功能代码尽量使用方法编写和调用。
5.2. 注意代码规范。
5.3. 必要的异常处理。
5.4. 必要的注释。
如需完整项目,可到http://www.bdjava.com/forum.php?mod=viewthread&tid=21&page=1&extra=#pid22位置下载附件