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

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

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

XML文档的解析

XML文档解析:操作xml文档,将文档中的数据读取到内存中  * 操作xml文档   1. 解析(读取):将文档中的数据读取到内存中   2. 写入:将内存中的数据保存到xml文档中.持久化的存储 * 解析xml的方式:   1. DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树    * 优点:操作方便,可以对文档进行CRUD的所有操作    * 缺点:占内存   2. SAX:逐行读取,基于事件驱动的.    * 优点:不占内存.    * 缺点:只能读取,不能增删改 * x

Java对XML文档的解析

1. DOM解析 DOM的全称是Document Object Model,也即文档对象模型.DOM解析会将XML文档以对象树的方式存入内存,因此,DOM解析内存消耗巨大.当然由于DOM解析将XML以节点树的方式调入内存,所以对文档进行增删改查(crud)比较方便.DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高.而且,对于结构复杂的树的遍历也是一项耗时的操作.所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想. ---

javaweb学习总结十三(dom4j方式对XML文档进行解析)

一:dom4j方式介绍 对于xml的解析总共有三种 1:jaxp方式,是sun公司开发的,分为sax方式和dom方式 2:jdom方式,后来其中部分人员参与开发dom4j 3:dom4j方式,是现在企业使用比较多的一种方式 二:代码案例 1:读取xml文件中某个节点 1):获取第二个学生的名字 1 @Test 2 // 1:获取第二个学生的名字 3 public void test01() throws DocumentException { 4 // 1:获取解析器 5 SAXReader r

XPath对XML文档的解析

首先,得感谢一下写XPath的开发人员考虑到中国人编写了中文文档! 使用XPath让我们解析XML文档变得更加灵活简单了. package it.xiehe.xml; import java.io.File; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Node; import org.dom4j.io.SAXReader; /* *

DOM4J与JDOM解析xml文档

1.   JDOM方式解析XML JDOM并不是java官方解析xml文档的方法,所以在进行文档解析前,需要下载JDOM的jar包:http://www.jdom.org/downloads/:并将其路径添加到当前项目中,或者把jar包拷贝到当前项目中. 同样地使用前面的books.xml文档进行解析: books.xml: <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book

解析简单xml文档

一.解析简单的xml文档 使用xml.etree.ElementTree 下的parse() xmlName.xml的文档的内容如下: <?xml version="1.0"?> <data> <country name="zhongguo"> <rank updated="yes">2</rank> <year >2017</year> <gdppc>

浅谈用java解析xml文档(三)

接上一篇,本文介绍使用JDOM解析xml文档, 首先我们还是应该知道JDOM从何而来,是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果,2000年初, JDOM作为一个开放源代码项目正式开始研发.JDOM是一种解析XML的Java工具包. JDOM基于树状结构,利用纯JAVA技术对XML文档实现解析.生成.序列化及其它操作. 我们从以下步骤开始解析: (1).通过JDOM的API创建一个SAXBuilder的对象 SAXBuilder saxBuilder

浅谈用java解析xml文档(一)

关于xml本身的语法及使用的环境不多说了,网上有很多规则, 然对xml文档进行解析,一般分为四种解析方式,基于java官方文档的Dom 和Sax解析,还有就是基于 第三方jar包的 Jdom 和 Dom4j解析. 一.首先我们来看Dom解析: 1.定义工厂,使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 在应用程序获取对 DocumentBuil

xml基础及其解析xml文档

xml基础及其解析xml文档 xml基础及其解析xml文档 xml基础语法 中国特色乱码问题 写xml文件的工具 xml中使用的转义字符 处理指令已经过时 xml的两个重要的功能 xml注释 xml解析Java应用程序读取xml文件的内容 xml解析原理 xml解析工具 DOM4J使用 DOM4J中核心API 将xml文档从磁盘读进内存形成Document对象 读取所有的标签节点 读取所有的属性节点 读取所有的文本节点 解决上面提出的问题 xml基础语法 一个基本的xml构成: <!--vers