码迷,mamicode.com
首页 > 其他好文 > 详细

关于XML文档pull解析的新思考-内省的应用

时间:2015-07-09 00:58:58      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:黑马课程

今天,复习黑马第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中。

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

以前看了反射和内省,当时还是朦朦胧胧,不知道它们到底有什么了不起的。现在我慢慢地发现这些技术如果明白了话,真的是非常实用的,真的像老师所说的,可以让我们少写很多的代码。


本文出自 “行意天下” 博客,请务必保留此出处http://4259297.blog.51cto.com/4249297/1672205

关于XML文档pull解析的新思考-内省的应用

标签:黑马课程

原文地址:http://4259297.blog.51cto.com/4249297/1672205

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!