今天,复习黑马第6天学习的pull解析XML文档,结合第10天讲的JavaBean,突然了有了新的思考。
以下是我创建的XML文档:
<?xml version="1.0" encoding="UTF-8"?> <!-- 定义一个演示文档,存储黑马的所有班级,以及每个班级的信息 利用XML的功能之一:XML用来表示生活中有关系的数据 --> <itheima> <class> <name>Anroid70期</name> <teacher>于俏</teacher> <time>2015年6月21日</time> <count>77</count> </class> <class> <name>JavaEE70期</name> <teacher>张子艺</teacher> <time>2015年7月2日</time> <count>83</count> </class> </itheima>
下面是XML解析的Java代码:
//pull解析xml文档开始。。。。。 try { //第1步:导入pull解析的包,得到pull解析工厂对象 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); //第2步:通过pull解析工厂得到pull解析器 XmlPullParser parser = factory.newPullParser(); //将XML文档的输入流引入pull解析器 InputStream in = new FileInputStream("D:\\HeiMa Dairy\\Other\\MyWorkSpace\\JDBCPractice\\WebRoot\\xml\\itheima.xml"); //指定解析器的输入流和编码集 parser.setInput(in, "utf-8"); //第4步:开始解析 //创建一个List集合,用来存储javabean,javabean会封装班级信息。 List<HeiMaClass> hmClassList = null; HeiMaClass hmClass = null; int type = 0; //标记解析的位置 while((type = parser.getEventType())!= XmlPullParser.END_DOCUMENT) //到了XML的文档末尾就结束解析 { //得到标签名,以作相应的判断 。 String tagName = parser.getName(); //用switch来判断解析的具体位置,比对标签名,采取相应的操作。 switch(type) { case XmlPullParser.START_TAG: //开始标签 if("itheima".equals(tagName)) { //创建封装班级javabean的集合对象 hmClassList = new ArrayList<HeiMaClass>(); } else if("class".equals(tagName)) { //创建班级javabean,以封装数据 hmClass = new HeiMaClass(); } else { //得到标签内容,用来封装进javabean hmClass中去。 String tagText = parser.nextText(); //利用内省,直接用标签文本,也即Javabean的属性来获取对应 //写入方法来赋值。 try { //内省重要代码************ //构造一个PropertyDescriptor对象 PropertyDescriptor pd = new PropertyDescriptor (tagName,hmClass.getClass()); //内省重要代码************ //得到属性的写入方法 Method writeMethod = pd.getWriteMethod(); try { //内省重要代码************ writeMethod.invoke(hmClass, tagText); } catch (Exception e) { e.printStackTrace(); } } catch (IntrospectionException e) { e.printStackTrace(); } } break; case XmlPullParser.END_TAG: //结束标签 if("class".equals(tagName)) { //将班级对象封装进List集合 hmClassList.add(hmClass); } break; } parser.next(); } //先在控制台上将List集合打印查看一下 for(HeiMaClass cla : hmClassList) { System.out.println(cla.toString()); } //将List集合写到Session域中,供请求页面获取输出 request.getSession().setAttribute("hmClassList2", hmClassList); //转发到请求页面 request.getRequestDispatcher("/pra/jdbc.jsp").forward(request, response); } catch (XmlPullParserException e) { e.printStackTrace(); }
在设计代码的时候,我采用的是javabean封装数据,XML文档中class这个标签对应的javabean代码如下:
//黑马班级类,用来演示pull解析XML,将XML中的班级数据封装到黑马班级类中。 public class HeiMaClass { private String name,teacher,time,count; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTeacher() { return teacher; } public void setTeacher(String teacher) { this.teacher = teacher; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public String getCount() { return count; } public void setCount(String count) { this.count = count; } public String toString() { return this.name + ":" + this.teacher + ":" + this.time + ":" + this.count; } }
在用else if语句判断对应javabean中的属性标签名时,我发现继续都是用属性名对应的方法来封装数据。那么,有没有可能通过javabean的属性名称(即对应xml文档的标签名称),得到这个属性的set方法呢?
后来我看了一下张孝祥老师的高新技术最后几个视频,发现这个正是内省技术,于是众多的else if语句通过javabean就很轻松的完成了。内省的简单操作是通过java.beans下的PropertyDescriptor类来实现的,构造这个类的对象需传递属性名称和字节码文件,然后通过getWriteMethod即可得到属性对应的写入方法,然后利用反射的原理即可封装数据至javabean中。
-------------------------------------------------------------------------------------------
以前看了反射和内省,当时还是朦朦胧胧,不知道它们到底有什么了不起的。现在我慢慢地发现这些技术如果明白了话,真的是非常实用的,真的像老师所说的,可以让我们少写很多的代码。
时间: 2024-10-21 22:59:56