以前在学校的时候学弟问过我一个毕业论文的课题,是关于用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;
}