dom4j实战(一)——使用dom4j从XML中读取数据源配置
2010-09-21 20:32
399 查看
目前XML
文件的应用越来越广泛,而操作XML
的技术更有不少,其中以dom4j
强大的性能,丰富的API
以及简单的易用性,受到了很多人的喜爱,本文以一个读取数据源的小例子,来说明一下dom4j
的一些基本操作。
dom4j
是
一个Java
的XML API
,同时也是一种解析XML文档的开源软件。由dom4j.org
开发,
具有性能优异、功能强大和极端易用的特点,大名鼎鼎的Hibernate
就是用它来读取配置文件滴。
本文只是对dom4j
的一些基本操作进行说明,不包含深入分析。(本文最后有源码和相关JAR包下载)
开发环境:Eclipse 3.2.1 MyEclipse 5.1.0GA dom4j-1.6.1.jar jaxen-1.1-beta-7.jar
1、创建Web Project
用Web Project
来演示的原因一是因为WEB-INF
目录下有一个lib
目录,例子中需要用到的jar
包,直接放进去就行了,二是这个系列后面讲的内容会需要。如果建Java Project
则还要设置库路径,为了方便,就用Web Project
吧。点击"File"->"New"->"Project"
,选择"Web Project"
,在"Project Name"
中输入demo
,点击"Finish"
。然后我们把dom4j-1.6.1.jar
和jaxen-1.1-beta-7.jar
还有MySQL
的连接驱动放到WEB-INF/lib
目录下。
2、创建DBConnect.xml
在
src
目录下建一个
DBConnect.xml
文件,内容如下:
<?
xml version="1.0" encoding="UTF-8"
?>
<
demo
>
<
database
>
<
driver
>
com.mysql.jdbc.Driver
</
driver
>
<
url
>
jdbc:mysql://127.0.0.1:3306/mysql
</
url
>
<
username
>
root
</
username
>
<
password
>
123
</
password
>
</
database
>
</
demo
>
大象在这里用
MySQL
的数据库,当然你也可以换成
SQL Server
或是
Oracle
,不过
XML
文件中对应的配置都要作相应的改动!
3、创建DataBaseConnect
.java
在src
上点右键,选择"New->Package"
,输入:com.demo.database
,在database
下新建一个类,类名为:
DataBaseConnect
。下面我们先写一段简单的代码,测试一下,看看能否从这个
XML
文件中读取到配置信息。在
DataBaseConnect
类中加入
main
函数,然后写上如下代码:
public
static
void
main(String[] args){
try
{
SAXReader saxReader
=
new
SAXReader();
//
使用SAXReader方式读取XML文件
//
加载数据库XML配置文件,得到Document对象
Document document
=
saxReader.read(
new
File(
"
src/DBConnect.xml
"
));
Element root
=
document.getRootElement();
//
获得根节点
//
得到database节点
Element database
=
(Element)root.selectSingleNode(
"
//demo/database
"
);
List list
=
database.elements();
//
得到database元素下的子元素集合
/*
* 循环遍历集合中的每一个元素
* 将每一个元素的元素名和值在控制台中打印出来
*/
for
(Object obj:list){
Element element
=
(Element)obj;
//
getName()是元素名,getText()是元素值
System.out.println(element.getName()
+
"
:
"
+
element.getText());
}
}
catch
(Exception e){
e.printStackTrace();
}
}
这里有三点要说明一下:
a、
saxReader.read(
new
File(
"src/DBConnect.xml"
))
,这个
read
方法是一个重载的方法,里面的参数可以为
File
、
FileInputStream
、
URL
等。所以这里还可以写成
new
FileInputStream (
"src/DBConnect.xml"
)
,另外还可以用
ClassLoader
来加载:
getClass().getClassLoader().getResourceAsStream(
"DBConnect.xml"
),
注意,这里不能加"src/
"
,因为它是在
WEB-INF/classes
里面找文件,另外不能写在静态的
main
函数里,可以在
main
方法外,创建一方法,在
main
中通过实例化类对象来调用,这里不再详述,大家自己去试下。
b、
root.selectSingleNode(
"//demo/database"
)
,这里的"//demo/database"
其实是一个
XPATH
语法,关于
XPATH
请参考相关资料,这里不作讨论。这样写的意思是指:
demo
根节点下的
database
节点,"selectSingleNode
"
是得到
database
这个单独的元素,至于
database
下面是否还包含别的信息,则是通过其它的
API
来操作。
c、
如果你在使用
XPATH
语法的时候没有加入
jaxen-1.1-beta-7.jar
这个包,就会出现如下异常:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)
at org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)
at org.dom4j.tree.AbstractNode.selectSingleNode(AbstractNode.java:183)
at com.demo.database.DataBaseConnect.main(DataBaseConnect.java:16)
如果没有问题的话,应该可以在控制台看到下面的结果:
driver: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/mysql
username: root
password:
123
到此,我们已经成功使用
dom4j
从
XML
中读取文件,下面我们对
DataBaseConnect
作一下修改,毕竟上面这种写法是测试用的,真正的类怎么可能这样写?
4、创建ClassUtils.java
新建
com.demo.util
包,在
util
包下新建
ClassUtils
类,用来处理资源加载方面的事情,内容如下:
/*
* 这里使用的是单态模式
*/
private
static
ClassUtils instance
=
new
ClassUtils();
//
实例化私有静态对象
/**
* 通过资源名称或资源路径得到资源输入流
*
@param
name 资源名称或资源路径
*/
public
static
InputStream getResourceAsStream(String name) {
/*
* 这里用到了回调方法
* 使用静态的私有对象,在静态方法中调用非静态的方法
* 并且loadResource是私有方法,对外不可见
*/
return
instance.loadResource(name);
}
/**
* 私有构造函数,不能在外部被实例化
*/
private
ClassUtils() {}
/**
* 通过资源名称或资源路径加载资源
*
@param
name 资源名称或资源路径
*
@return
InputStream
*/
private
InputStream loadResource(String name) {
return
getClass().getClassLoader().getResourceAsStream(name);
}
5、创建Constant
接口
在util
包下再建一个
Constant
接
口,里面放的是数据源配置常量字符串,与XML文件中的元素名对应,在这里是将DBConnect.xml放在src目录下,如果你想放到其它的目录下,
则要加上包名,比如放在database包下,那么应该写成:com/demo/database/DBConnect.xml。
String DRIVER
=
"
driver
"
;
String URL
=
"
url
"
;
String USERNAME
=
"
username
"
;
String PASSWORD
=
"
password
"
;
String DB_CONFIG
=
"
DBConnect.xml
"
;
在接口中,方法自动定义成public
的,域自动的被定义为public
、static
和final
的,因此不用显式的声明。
6、修改DataBaseConnect
类
最后我们来修改DataBaseConnect
类,首先我们定义几个静态变量:
private
static
Element coreModel;
//
根元素
private
static
String driver;
//
连接驱动
private
static
String url;
//
数据库连接地址
private
static
String username;
//
用户名
private
static
String password;
//
密码
读取DBConnect.xml
文件,获得根元素:
/**
* 加载数据源配置文件,取得根元素
*/
private
static
void
load(){
SAXReader saxReader
=
new
SAXReader();
//
加载数据库XML配置文件
InputStream in
=
ClassUtils.getResourceAsStream(Constant.DB_CONFIG);
try
{
Document document
=
saxReader.read(in);
//
得到Document对象
coreModel
=
document.getRootElement();
//
得到根元素
}
catch
(Exception e){
System.out.println(
"
XML配置文件未加载成功,请检查
"
);
throw
new
RuntimeException(e);
}
}
将load
方法静态初始化:
static
{
load();
}
通过XPATH
路径得到对应的元素:
/**
* 通过XPATH得到元素对象
*
@param
xPath XPATH路径
*
@return
获得Element对象
*/
public
static
Element getElement(String xPath){
return
(Element)coreModel.selectSingleNode(xPath);
}
再写一个方法,读取数据源配置信息,将之放入HashMap
中:
/**
* 取得数据源配置信息放入HashMap中
*
@param
hashmap 存放取得的数据源键值对
*
@return
返回存放信息的HashMap
*/
public
static
HashMap
<
String,String
>
iterateXML(HashMap
<
String,String
>
hashmap){
try
{
Element database
=
getElement(
"
//demo/database
"
);
//
得到database节点
List list
=
database.elements();
//
得到database元素下的子元素集合
/*
* 循环遍历集合中的每一个元素
* 将每一个元素的元素名和值作为键值对放入HashMap中
*/
for
(Object obj:list){
Element element
=
(Element)obj;
//
getName()是元素名,getText()是元素值
hashmap.put(element.getName(), element.getText());
}
}
catch
(Exception e){
e.printStackTrace();
}
return
hashmap;
}
构造函数:
/**
* 构造函数初始化
*/
public
DataBaseConnect(){
HashMap
<
String,String
>
hashmap
=
new
HashMap
<
String,String
>
();
hashmap
=
iterateXML(hashmap);
//
取得数据源配置信息
driver
=
hashmap.get(Constant.DRIVER);
url
=
hashmap.get(Constant.URL);
username
=
hashmap.get(Constant.USERNAME);
password
=
hashmap.get(Constant.PASSWORD);
}
创建数据库连接及关闭等操作,此处省略,请查看源码。
最后我们写一个main
方法来测试一下是否能够连接数据库:
public
static
void
main(String[] args){
DataBaseConnect db
=
new
DataBaseConnect();
Connection con
=
db.getConnection();
try
{
PreparedStatement psmt
=
con.prepareStatement(
"
select count(*) from help_keyword
"
);
ResultSet rs
=
psmt.executeQuery();
rs.next();
System.out.println(rs.getString(
1
));
rs.close();
psmt.close();
db.close(con);
}
catch
(Exception e){
throw
new
RuntimeException(e);
}
}
如果没问题,控制台将打印出:381
的结果。
这里附上DBConnect.xml
中SQL Server 2000和Oracle的配置,其中SQL Server采用JTDS驱动。
<?
xml version="1.0" encoding="UTF-8"
?>
<
demo
>
<
database
>
<
driver
>
net.sourceforge.jtds.jdbc.Driver
</
driver
>
<
url
>
jdbc:jtds:sqlserver://127.0.0.1:1433/pubs
</
url
>
<
username
>
sa
</
username
>
<
password
>自己密码(无密码就空着
)
</
password
>
</
database
>
</
demo
>
<?
xml version="1.0" encoding="UTF-8"
?>
<
demo
>
<
database
>
<
driver
>
oracle.jdbc.driver.OracleDriver
</
driver
>
<
url
>
jdbc:oracle:thin:@127.0.0.1:1521:自己的SID
</
url
>
<
username
>
system
</
username
>
<
password
>
自己密码(无密码就空着)
</
password
>
</
database
>
</
demo
>
本着对别人负责,同时也是对自己负责,全部代码,大象都是亲手写出来在电脑上测试过,并且还模拟了产生异常的环境,请大家放心使用。
点击下载:dom4j-1.6.1.jar
jaxen-1.1-beta-7.jar
mysql-connector
.jar
jtds.jar
classes12.jar
点击下载:demo
(直接导入即可,加入上面的jar包)
本文为菠萝大象原创,如要转载请注明出处。
文件的应用越来越广泛,而操作XML
的技术更有不少,其中以dom4j
强大的性能,丰富的API
以及简单的易用性,受到了很多人的喜爱,本文以一个读取数据源的小例子,来说明一下dom4j
的一些基本操作。
dom4j
是
一个Java
的XML API
,同时也是一种解析XML文档的开源软件。由dom4j.org
开发,
具有性能优异、功能强大和极端易用的特点,大名鼎鼎的Hibernate
就是用它来读取配置文件滴。
本文只是对dom4j
的一些基本操作进行说明,不包含深入分析。(本文最后有源码和相关JAR包下载)
开发环境:Eclipse 3.2.1 MyEclipse 5.1.0GA dom4j-1.6.1.jar jaxen-1.1-beta-7.jar
1、创建Web Project
用Web Project
来演示的原因一是因为WEB-INF
目录下有一个lib
目录,例子中需要用到的jar
包,直接放进去就行了,二是这个系列后面讲的内容会需要。如果建Java Project
则还要设置库路径,为了方便,就用Web Project
吧。点击"File"->"New"->"Project"
,选择"Web Project"
,在"Project Name"
中输入demo
,点击"Finish"
。然后我们把dom4j-1.6.1.jar
和jaxen-1.1-beta-7.jar
还有MySQL
的连接驱动放到WEB-INF/lib
目录下。
2、创建DBConnect.xml
在
src
目录下建一个
DBConnect.xml
文件,内容如下:
<?
xml version="1.0" encoding="UTF-8"
?>
<
demo
>
<
database
>
<
driver
>
com.mysql.jdbc.Driver
</
driver
>
<
url
>
jdbc:mysql://127.0.0.1:3306/mysql
</
url
>
<
username
>
root
</
username
>
<
password
>
123
</
password
>
</
database
>
</
demo
>
大象在这里用
MySQL
的数据库,当然你也可以换成
SQL Server
或是
Oracle
,不过
XML
文件中对应的配置都要作相应的改动!
3、创建DataBaseConnect
.java
在src
上点右键,选择"New->Package"
,输入:com.demo.database
,在database
下新建一个类,类名为:
DataBaseConnect
。下面我们先写一段简单的代码,测试一下,看看能否从这个
XML
文件中读取到配置信息。在
DataBaseConnect
类中加入
main
函数,然后写上如下代码:
public
static
void
main(String[] args){
try
{
SAXReader saxReader
=
new
SAXReader();
//
使用SAXReader方式读取XML文件
//
加载数据库XML配置文件,得到Document对象
Document document
=
saxReader.read(
new
File(
"
src/DBConnect.xml
"
));
Element root
=
document.getRootElement();
//
获得根节点
//
得到database节点
Element database
=
(Element)root.selectSingleNode(
"
//demo/database
"
);
List list
=
database.elements();
//
得到database元素下的子元素集合
/*
* 循环遍历集合中的每一个元素
* 将每一个元素的元素名和值在控制台中打印出来
*/
for
(Object obj:list){
Element element
=
(Element)obj;
//
getName()是元素名,getText()是元素值
System.out.println(element.getName()
+
"
:
"
+
element.getText());
}
}
catch
(Exception e){
e.printStackTrace();
}
}
这里有三点要说明一下:
a、
saxReader.read(
new
File(
"src/DBConnect.xml"
))
,这个
read
方法是一个重载的方法,里面的参数可以为
File
、
FileInputStream
、
URL
等。所以这里还可以写成
new
FileInputStream (
"src/DBConnect.xml"
)
,另外还可以用
ClassLoader
来加载:
getClass().getClassLoader().getResourceAsStream(
"DBConnect.xml"
),
注意,这里不能加"src/
"
,因为它是在
WEB-INF/classes
里面找文件,另外不能写在静态的
main
函数里,可以在
main
方法外,创建一方法,在
main
中通过实例化类对象来调用,这里不再详述,大家自己去试下。
b、
root.selectSingleNode(
"//demo/database"
)
,这里的"//demo/database"
其实是一个
XPATH
语法,关于
XPATH
请参考相关资料,这里不作讨论。这样写的意思是指:
demo
根节点下的
database
节点,"selectSingleNode
"
是得到
database
这个单独的元素,至于
database
下面是否还包含别的信息,则是通过其它的
API
来操作。
c、
如果你在使用
XPATH
语法的时候没有加入
jaxen-1.1-beta-7.jar
这个包,就会出现如下异常:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)
at org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)
at org.dom4j.tree.AbstractNode.selectSingleNode(AbstractNode.java:183)
at com.demo.database.DataBaseConnect.main(DataBaseConnect.java:16)
如果没有问题的话,应该可以在控制台看到下面的结果:
driver: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/mysql
username: root
password:
123
到此,我们已经成功使用
dom4j
从
XML
中读取文件,下面我们对
DataBaseConnect
作一下修改,毕竟上面这种写法是测试用的,真正的类怎么可能这样写?
4、创建ClassUtils.java
新建
com.demo.util
包,在
util
包下新建
ClassUtils
类,用来处理资源加载方面的事情,内容如下:
/*
* 这里使用的是单态模式
*/
private
static
ClassUtils instance
=
new
ClassUtils();
//
实例化私有静态对象
/**
* 通过资源名称或资源路径得到资源输入流
*
@param
name 资源名称或资源路径
*/
public
static
InputStream getResourceAsStream(String name) {
/*
* 这里用到了回调方法
* 使用静态的私有对象,在静态方法中调用非静态的方法
* 并且loadResource是私有方法,对外不可见
*/
return
instance.loadResource(name);
}
/**
* 私有构造函数,不能在外部被实例化
*/
private
ClassUtils() {}
/**
* 通过资源名称或资源路径加载资源
*
@param
name 资源名称或资源路径
*
@return
InputStream
*/
private
InputStream loadResource(String name) {
return
getClass().getClassLoader().getResourceAsStream(name);
}
5、创建Constant
接口
在util
包下再建一个
Constant
接
口,里面放的是数据源配置常量字符串,与XML文件中的元素名对应,在这里是将DBConnect.xml放在src目录下,如果你想放到其它的目录下,
则要加上包名,比如放在database包下,那么应该写成:com/demo/database/DBConnect.xml。
String DRIVER
=
"
driver
"
;
String URL
=
"
url
"
;
String USERNAME
=
"
username
"
;
String PASSWORD
=
"
password
"
;
String DB_CONFIG
=
"
DBConnect.xml
"
;
在接口中,方法自动定义成public
的,域自动的被定义为public
、static
和final
的,因此不用显式的声明。
6、修改DataBaseConnect
类
最后我们来修改DataBaseConnect
类,首先我们定义几个静态变量:
private
static
Element coreModel;
//
根元素
private
static
String driver;
//
连接驱动
private
static
String url;
//
数据库连接地址
private
static
String username;
//
用户名
private
static
String password;
//
密码
读取DBConnect.xml
文件,获得根元素:
/**
* 加载数据源配置文件,取得根元素
*/
private
static
void
load(){
SAXReader saxReader
=
new
SAXReader();
//
加载数据库XML配置文件
InputStream in
=
ClassUtils.getResourceAsStream(Constant.DB_CONFIG);
try
{
Document document
=
saxReader.read(in);
//
得到Document对象
coreModel
=
document.getRootElement();
//
得到根元素
}
catch
(Exception e){
System.out.println(
"
XML配置文件未加载成功,请检查
"
);
throw
new
RuntimeException(e);
}
}
将load
方法静态初始化:
static
{
load();
}
通过XPATH
路径得到对应的元素:
/**
* 通过XPATH得到元素对象
*
@param
xPath XPATH路径
*
@return
获得Element对象
*/
public
static
Element getElement(String xPath){
return
(Element)coreModel.selectSingleNode(xPath);
}
再写一个方法,读取数据源配置信息,将之放入HashMap
中:
/**
* 取得数据源配置信息放入HashMap中
*
@param
hashmap 存放取得的数据源键值对
*
@return
返回存放信息的HashMap
*/
public
static
HashMap
<
String,String
>
iterateXML(HashMap
<
String,String
>
hashmap){
try
{
Element database
=
getElement(
"
//demo/database
"
);
//
得到database节点
List list
=
database.elements();
//
得到database元素下的子元素集合
/*
* 循环遍历集合中的每一个元素
* 将每一个元素的元素名和值作为键值对放入HashMap中
*/
for
(Object obj:list){
Element element
=
(Element)obj;
//
getName()是元素名,getText()是元素值
hashmap.put(element.getName(), element.getText());
}
}
catch
(Exception e){
e.printStackTrace();
}
return
hashmap;
}
构造函数:
/**
* 构造函数初始化
*/
public
DataBaseConnect(){
HashMap
<
String,String
>
hashmap
=
new
HashMap
<
String,String
>
();
hashmap
=
iterateXML(hashmap);
//
取得数据源配置信息
driver
=
hashmap.get(Constant.DRIVER);
url
=
hashmap.get(Constant.URL);
username
=
hashmap.get(Constant.USERNAME);
password
=
hashmap.get(Constant.PASSWORD);
}
创建数据库连接及关闭等操作,此处省略,请查看源码。
最后我们写一个main
方法来测试一下是否能够连接数据库:
public
static
void
main(String[] args){
DataBaseConnect db
=
new
DataBaseConnect();
Connection con
=
db.getConnection();
try
{
PreparedStatement psmt
=
con.prepareStatement(
"
select count(*) from help_keyword
"
);
ResultSet rs
=
psmt.executeQuery();
rs.next();
System.out.println(rs.getString(
1
));
rs.close();
psmt.close();
db.close(con);
}
catch
(Exception e){
throw
new
RuntimeException(e);
}
}
如果没问题,控制台将打印出:381
的结果。
这里附上DBConnect.xml
中SQL Server 2000和Oracle的配置,其中SQL Server采用JTDS驱动。
<?
xml version="1.0" encoding="UTF-8"
?>
<
demo
>
<
database
>
<
driver
>
net.sourceforge.jtds.jdbc.Driver
</
driver
>
<
url
>
jdbc:jtds:sqlserver://127.0.0.1:1433/pubs
</
url
>
<
username
>
sa
</
username
>
<
password
>自己密码(无密码就空着
)
</
password
>
</
database
>
</
demo
>
<?
xml version="1.0" encoding="UTF-8"
?>
<
demo
>
<
database
>
<
driver
>
oracle.jdbc.driver.OracleDriver
</
driver
>
<
url
>
jdbc:oracle:thin:@127.0.0.1:1521:自己的SID
</
url
>
<
username
>
system
</
username
>
<
password
>
自己密码(无密码就空着)
</
password
>
</
database
>
</
demo
>
本着对别人负责,同时也是对自己负责,全部代码,大象都是亲手写出来在电脑上测试过,并且还模拟了产生异常的环境,请大家放心使用。
点击下载:dom4j-1.6.1.jar
jaxen-1.1-beta-7.jar
mysql-connector
.jar
jtds.jar
classes12.jar
点击下载:demo
(直接导入即可,加入上面的jar包)
本文为菠萝大象原创,如要转载请注明出处。
相关文章推荐
- dom4j实战(一)——使用dom4j从XML中读取数据源配置
- dom4j实战(一)——使用dom4j从XML中读取数据源配置
- dom4j实战(一)——使用dom4j从XML中读取数据源配置
- 使用dom4j读取xml配置文件
- SpringBoot内部配置:“application.properties配置”和”使用XML配置”,读取属性文件中的内容,日志配置,Profile配置(学习:SpringBoot实战)
- java dom4j解析XML读取数据源配置的代码实例
- dom4j 读取xml 数据库配置文件 dataconfig
- 使用Linq to Xml 读取配置文件
- Java实战(一)—Dom4J读取配置文件实现抽象工厂+反射
- SIA实战(二):不用XML,使用java类配置Bean
- 使用dom4j:读取spring配置文件,实例化bean对象并注入依赖对象
- cocos2dx C++使用rapidxml读取XML配置文件
- 使用Spring中Src下 -context.xml : 用资源文件夹保存数据库的链接信息 并在配置文件里读取
- Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))【附带实例源码】
- dom4j使用xpath读取xml 小例子
- 使用dom4j从XML配置文件中生成菜单(一)
- dom4j中使用SAXReader读取xml文件出现Premature end of file异常问题
- Dom4j使用Xpath语法读取xml节点
- DOM4J的使用(一)-----读取XML
- 【XML配置文件读取】使用jdom读取XML配置文件信息