思路:依然是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
如果不加这个解析器,是无法识别的。