您的位置:首页 > 其它

Use Jdom to Read XML file

2010-12-06 18:46 375 查看
package com.jadyer.bean;

/**
 * 封装Jdom读取XML文件所得到的节点内容
 */
public class JdbcInfo {
	private String driverClass;
	private String url;
	private String userName;
	private String password;

	/*--四个属性对应的getter和setter略--*/

	@Override
	public String toString() {
		return "driverClass=" + driverClass +
		       "/nurl=" + url +
		       "/nuserName=" + userName +
		       "/npassword=" + password;
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这是一个XML格式的全局配置文件,用以被Jdom读取之用 -->
<sys-configure>
	<jdbc-info>
		<driver-class>oracle.jdbc.OracleDriver</driver-class>
		<url>jdbc:oracle:thin:@127.0.0.1:1521:ora10</url>
		<username>scott</username>
		<password>moon</password>
	</jdbc-info>
	<beans>
		<bean id="com.jadyer.blog.dao.LinkDao" class="com.jadyer.blog.dao.hibernate.LinkDaoHibernate"/>
		<bean id="com.jadyer.vote.dao.UserDao" class="com.jadyer.vote.dao.hibernate.UserDaoHibernate"/>
	</beans>
</sys-configure>


package com.jadyer.util;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;

import com.jadyer.bean.JdbcInfo;

/**
 * 采用JDOM读取XML配置文件
 * @see 该类使用了单态模式
 */
public class XMLConfigReader {
	private static XMLConfigReader instance = new XMLConfigReader();
	private static final String CONFIG_FILE_NAME = "gobal-configure.xml";
	private Element rootElt; //得到了Element之后,就相当于得到了整个文件一样
	private JdbcInfo jdbcInfo = new JdbcInfo(); //JdbcInfo类的toString()被我们重写了
	private Map beanMap = new HashMap();

	private XMLConfigReader() {
		//使用Jdom中的SAXBuilder类读配置文件
		SAXBuilder sb = new SAXBuilder();
		try {
			//在sb的build()方法中需要指定文件路径。currentThread()返回当前执行的线程。getResourceAsStream()返回读取指定资源的输入流
			Document doc = sb.build(Thread.currentThread().getContextClassLoader().getResourceAsStream(CONFIG_FILE_NAME));
			
			//取得配置文件的根。也就是把<sys-configure>取到了
			//然后也可以通过rootElt.getChildren()一层一层的向下读取节点内容。就好像得到它的孩子一样
			//不过这么做比较麻烦,所以这里介绍另一种方法:采用XPath直接定位到具体的元素上,更简单、更块
			rootElt = doc.getRootElement();
			
			this.initJdbcInfo();
			this.initBeans();
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void initJdbcInfo() {
		try {
			//获得配置文件中的单个节点
			Element driverClassNameElt = (Element) XPath.selectSingleNode(rootElt, "//sys-configure/jdbc-info/driver-class");
			
			//获取并输出配置文件中<driver-class-name>的值
			//System.out.println(driverClassNameElt.getText());
			
			//将读取到的配置文件中的<driver-class-name>值放到一个对象中
			jdbcInfo.setDriverClass(driverClassNameElt.getText());
			
			Element urlElt = (Element) XPath.selectSingleNode(rootElt, "//sys-configure/jdbc-info/url");
			jdbcInfo.setUrl(urlElt.getText());
			Element userNameElt = (Element) XPath.selectSingleNode(rootElt,	"//sys-configure/jdbc-info/username");
			jdbcInfo.setUserName(userNameElt.getText());
			Element passwordElt = (Element) XPath.selectSingleNode(rootElt,	"//sys-configure/jdbc-info/password");
			jdbcInfo.setPassword(passwordElt.getText());
		} catch (JDOMException e) {
			e.printStackTrace();
		}
	}

	private void initBeans() {
		try {
			List beanList = XPath.selectNodes(rootElt, "//sys-configure/beans/bean");
			
			//返回配置文件中的多个结点。所返回的List中的元素是一个由许多Element组成的
			//它每一个结点都是Element,所以直接循环List取Element就可以了
			for (Iterator iter = beanList.iterator(); iter.hasNext();) {
				Element beanElt = (Element) iter.next();// 在Jdom中每一个节点都是Element
				String id = beanElt.getAttributeValue("id");// 获取元素的属性所对应的值
				String className = beanElt.getAttributeValue("class");
				
				//System.out.println("id=" + id);
				//System.out.println("class=" + className);
				
				//通过反射的方式将字符串实例化成一个对象,然后再放到Map中
				Object obj=Class.forName(className).newInstance();
				beanMap.put(id, obj);
			}
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public static XMLConfigReader getInstance() {
		return instance;
	}
	
	public JdbcInfo getJdbcInfo() {
		return jdbcInfo;
	}

	public Object getBean(Class c){
		//将Class的name作为KEY值。这里Class.getName()会得到类的完整路径,即包名加类名
		return beanMap.get(c.getName());
	}

	public static void main(String[] args) {
		System.out.println(XMLConfigReader.getInstance().getJdbcInfo());
		//这里没有传字符串,即没有把com.jadyer.blog.dao.LinkDao当作参数传进来
		//若输入字符串,则可能会写错。将类作为参数传递,则不会出错。因为写错类名时会自动报错
		//LinkDao linkDao = (LinkDao)GlobalConfigure.getInstance().getBean(LinkDao.class);
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: