DOM4j解析XML(依赖注入)

DOM4j解析xml,可去官网http://sourceforge.net/projects/dom4j最新版本

解析XML

1>先通过SAXReader对象中read方法以及方法名获取对应的文档对象Document

SAXReader reader=new SAXReader();
Document document=reader.read(InputStream对象);

2>获取Root(根节点)

Element root=document.getRootElement();

3>XML的遍历

XML提供了对XPath的支持,可以直接获取整个XML文档中满足此路径的所有节点

List<Element> elementList=document.selectNodes("//根元素下的子节点");

获取节点中的属性:如<bean id="userService" class="com.xuzengqiang.tour.service.user.impl.UserServiceImpl">

那么就可以通过Attribute遍历获取节点中的属性

List<Attribute> attrList=element.attributes();
for(Attribute attribute: attrList)
{
	System.out.println(attribute.getName()+"----"+attribute.getValue());
}

打印的结果就为:

id----userService

class----com.xuzengqiang.tour.service.user.impl.UserServiceImpl

节点的遍历(root为根节点,这里只是遍历根目录下的一级目录,如果想遍历所有节点,可以利用递归实现)。

for(Iterator iterator=root.elementIterator(); iterator.hasNext();)
{
	Element element=(Element)iterator.next();
	for(Iterator it=element.attributeIterator(); it.hasNext(); )
	{
		Attribute attribute=(Attribute)it.next();
		System.out.println(attribute.getName()+"----"+attribute.getValue());
	}
}

其它的操作略去,如创建XML文档、修改、删除等XML操作。

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

利用Dom4j仿Spring实现依赖注入。

在类路径下新建一个application.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans>
	<bean id="userService" class="com.xuzengqiang.tour.service.user.impl.UserServiceImpl">
		<property name="userDao" ref="userDao"/>
	</bean>
	
	<bean id="userDao" class="com.xuzengqiang.tour.dao.user.impl.UserDaoImpl">
	</bean>
</beans>	

beanFactory:通过BeanFactory中的getBean获取所需对象。

package com.xuzengqiang.tour.common.web.framework;

public interface BeanFactory {

	public Object getBean(String objName);
}

读取

package com.xuzengqiang.tour.common.web.framework;

import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.xuzengqiang.tour.common.web.exception.TourException;
import com.xuzengqiang.tour.service.user.UserService;

@SuppressWarnings("all")
public class ClasspathXMLApplicationContext implements BeanFactory
{
	private Map<String, Object> beanMap ;
	private String fileName;  //解析xml的文件名(存放在类路径)
	
	//解析XML
	public ClasspathXMLApplicationContext(String fileName) {
		InputStream is=null;
		SAXReader reader=null;
		Document document=null;
		try
		{
			beanMap=new LinkedHashMap<String , Object>();
			reader=new SAXReader();
			is=ClasspathXMLApplicationContext.class.getClassLoader().getResourceAsStream(fileName);
			document=reader.read(is); //XML文档对象
			//Element root=document.getRootElement();  //获取根节点
			//先初始化bean节点<bean id="" class="">
			initBean(document);
			//初始化setXxx()<property name="" ref="">方法
			initSetMethod(document);
		}
		catch(Exception e)
		{
			throw new TourException("XML解析失败!");
		}
	}

	public void initBean(Document document){
		List<Element> list=document.selectNodes("//beans/bean");
		Iterator iterator=list.iterator();
		try{
			while(iterator.hasNext())
			{
				Element element=(Element)iterator.next();
				//获取节点名称:element.getName();
				
				//获取节点中的属性值
				List<Attribute> attrList=element.attributes();
				String beanName=null;
				String beanValue=null;
				for(Attribute attribute: attrList)
				{
					if("id".equals(attribute.getName()))
					{
						beanName=attribute.getValue();
					}
					if("class".equals(attribute.getName()))
					{
						beanValue=attribute.getValue();
					}
				}
				Class clazz=Class.forName(beanValue);
				beanMap.put(beanName, clazz.newInstance());
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	

	private void initSetMethod(Document document) 
	{
		List<Element> list=document.selectNodes("//beans/bean/property");
		Iterator iterator=list.iterator();
		try{
			while(iterator.hasNext())
			{
				Element element=(Element)iterator.next();
				Element parent=element.getParent();          //获取它的父节点
				List<Attribute> attrList=element.attributes();
				String setName=null;
				String refName=null;
				for(Attribute attribute: attrList)
				{
					if("name".equals(attribute.getName()))
					{
						setName=attribute.getValue();
					}
					if("ref".equals(attribute.getName()))
					{
						refName=attribute.getValue();
					}
				}
				
			    attrList=parent.attributes();
				for(Attribute attribute:attrList)
				{
					if("id".equals(attribute.getName()))
					{
						//目标对象
						Object targetObj=beanMap.get(attribute.getValue());
						//获取setXxx方法名
						String methodName="set"+setName.substring(0,1).toUpperCase()+setName.substring(1);
						
						Object obj=beanMap.get(refName);
						//利用反射机制获取setXxx方法
						Method method=targetObj.getClass().getDeclaredMethod(methodName, obj.getClass().getInterfaces());
						method.invoke(targetObj, obj);
					}
				}
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	public Object getBean(String objName)
	{
		if(beanMap == null || beanMap.size()==0)
		{
			throw new TourException("对不起,属性文件中不存在此对象!");
		}
		else 
		{
			Object obj=new Object();
			obj=beanMap.get(objName);
			return obj;
		}
	}
	
	public static void main(String[] args) {
		BeanFactory beanFactory=new ClasspathXMLApplicationContext("application.xml");
		UserService userService=(UserService)beanFactory.getBean("userService");
		userService.addUser();
	}
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值