java解析hibernate.cfg.xml

思路:依然是DOM4J的DOM思想,都是先通过各种方法得到Document doc,对象,然后获取到根节点,再然后就是迭代了。

 

注意点:和读取一般的xml文件最大的区别是:要在SAXReader上面加一个解析器EntityResolver

 

用到的jar包:hibernate3所有jar

 

hibernate.cfg.xml位置:放在src根目录下。

 

ReadXmlTest类:

package test.testxml;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Properties;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import junit.framework.TestCase;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.hibernate.util.XMLHelper;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import util.CommonUtil;
import util.MySaxHandler;


public class ReadXmlTest extends TestCase {
	Properties properties=new Properties();
	protected transient XMLHelper xmlHelper=new XMLHelper();
	private EntityResolver entityResolver=XMLHelper.DEFAULT_DTD_RESOLVER;
	
	/**
	 * 读取hibernate的配置文件的方法1
	 */
	public void testHibernateXmlRead1(){
		try {
			SAXReader saxReader=new SAXReader();
			saxReader.setEntityResolver(entityResolver);//这是关键
			String resource="/hibernate.cfg.xml";
			InputStream inputStream=CommonUtil.getResourceAsStream(resource);
			//拿到文件流,方法1		
			
			//拿到文件流,方法2	
//			String filePath=ReadXmlTest.class.getClassLoader().getResource("").getPath();
//			System.out.println("filePath="+filePath);
//			InputStream inputStream=new FileInputStream(filePath+resource);
			
//			List errors = new ArrayList();
//			Document doc = xmlHelper.createSAXReader( resource, errors, entityResolver )
//					.read( new InputSource( stream ) );
			
			Document doc=saxReader.read(new InputSource(inputStream));
			Element rootElement=doc.getRootElement().element("session-factory");
			addProperties(rootElement);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private void addProperties(Element parent) {
		Iterator iter = parent.elementIterator( "property" );
		while ( iter.hasNext() ) {
			Element node = (Element) iter.next();
			String name = node.attributeValue( "name" );
			String value = node.getText().trim();
			if(name.equals("hibernate.connection.username")){
				System.out.println("用户名为:"+value);
			}
			properties.setProperty( name, value );
			if ( !name.startsWith( "hibernate" ) ) {
				properties.setProperty( "hibernate." + name, value );
			}
		}
	}
	
}

 

 

这个方法运行后可以打出数据库用户名为:root

如果不加这个解析器,是无法识别的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Hibernate)