解析XML文件,并将信息显示在窗体上

 

  1. 仔细观察如下窗口及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>

 

  1. 完成以下功能:

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控件上。

  1. 事件处理:

3.1.      点击ListView中的一项,在文本框中显示该项内容。

3.2.      点击“首条”、“前条”、“后条”、“尾条”按钮,可以从当前显示位置翻看集合中的相应对象内容。

  1. 打印功能:

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

------------

  1. 程序要求:

5.1.      对独立功能代码尽量使用方法编写和调用。

5.2.      注意代码规范。

5.3.      必要的异常处理。

5.4.      必要的注释。

 

如需完整项目,可到http://www.bdjava.com/forum.php?mod=viewthread&tid=21&page=1&extra=#pid22位置下载附件

转载于:https://www.cnblogs.com/hidelin/archive/2012/09/22/2698016.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值