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();
}
}