spring框架xml解析原理小例

以前在学校的时候学弟问过我一个毕业论文的课题,是关于用Java设计一个自动解析xml文件的项目,当时菜鸟不明白,觉得很难,现在所有长进,就写一个demo复习一下。

现在写一个有关dept和emp信息的xml,applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="emp1" class="com.company.pojo.Emp">
		<property name="empno" value="1001"></property>
		<property name="ename" value="zhao"></property>
		<property name="sal" value="5000.51"></property>
		<property name="hiredate" value="2006-01-01"></property>
	</bean>
	<bean id="emp2" class="com.company.pojo.Emp">
		<property name="empno" value="1002"></property>
		<property name="ename" value="qian"></property>
		<property name="sal" value="5300.51"></property>
		<property name="hiredate" value="2006-11-01"></property>
	</bean>
	<bean id="dept1" class="com.company.pojo.Dept">
		<property name="deptno" value="10"></property>
		<property name="dname" value="ACCOUNTING"></property>
	</bean>
</beans>

先看一下目录结构吧:

处理xml的解析方法主要放在了ClassPathXml类里,IOCService主要是用来测试的主方法。

 

ApplicationContext.java 这个类就先定义一个接口,抛出异常

public interface ApplicationContext {
	public Object getBean(String id)throws Exception;
}

现在开始处理了 ClassPathXml.java: 实现ApplicationContext.java这个接口(代码片段是连贯的)

上面的引入文件都是一会需要用到的~用到的再详细说

首先创建一个 configFile的字符串对象,指向的是applicationContext.xml 这个文件名 定义两种ClassPathXml方法,一个有参的一个没有参的,这两个方法中调用 initIOC()这个方法,这个方法一会再说

import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

public class ClassPathXml implements ApplicationContext {

	private String configFile;

	public ClassPathXml() {
		configFile = "applicationContext.xml";
		try {
			initIOC();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public ClassPathXml(String configFile) {
		super();
		this.configFile = configFile;
		try {
			initIOC();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

现在开始解析配置文件了

备注字有点小。。

    public Map<String, Map<String, Object>> getInfoFromXml() throws Exception {

		Map<String, String> props = null;// property-->name+value
		Map<String, Object> bean = null;// id,class,property
		Map<String, Map<String, Object>> beans = null;// id,bean

		// 1-生成XmlPullParser对象,读入配置文件
		XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();
		InputStream in = ClassPathXml.class.getClassLoader().getResourceAsStream(configFile);
		pullParser.setInput(in, "utf-8");
		// 2-获取事件类型,根据不同事件类型,进行不同操作
		int eventType = pullParser.getEventType();
		while (eventType != XmlPullParser.END_DOCUMENT) {
			// pull解析方式--基于事件的
			switch (eventType) {
			case XmlPullParser.START_DOCUMENT:
				beans = new HashMap<String, Map<String, Object>>();
				break;
			case XmlPullParser.START_TAG:
				if ("bean".equals(pullParser.getName())) {
					bean = new HashMap<String, Object>();
					String idAttr = pullParser.getAttributeValue(null, "id");
					String classAttr = pullParser.getAttributeValue(null, "class");
					bean.put("id", idAttr);
					bean.put("class", classAttr);
					props = new HashMap<String, String>();
				}
				if ("property".equals(pullParser.getName())) {

					String propName = pullParser.getAttributeValue(null, "name");
					String propValue = pullParser.getAttributeValue(null, "value");
					props.put(propName, propValue);

				}
				break;
			case XmlPullParser.END_TAG:
				if ("bean".equals(pullParser.getName())) {
					bean.put("property", props);
					beans.put((String) bean.get("id"), bean);
				}
				break;
			}
			eventType = pullParser.next();
		}

		// 3-返回解析后的对象

		return beans;
	}

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值