目前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包)
分享到:
相关推荐
**DOM4J——XML解析库详解** XML(eXtensible Markup Language)作为一种标记语言,广泛应用于数据交换、配置文件和文档存储等领域。在Java环境中,解析XML文档时,我们通常会遇到各种库,其中DOM4J是一个非常流行...
在实际开发中,DOM4J常用于读取XML配置文件、解析XML数据、生成XML报告等场景。例如,通过`Document`对象读取XML文件,然后使用`Element`和`XPath`来获取或修改数据。同时,DOM4J还提供了`Writer`接口,可以将XML...
XPath是一种在XML文档中查找信息的语言,DOM4J支持XPath表达式,使得我们可以快速定位到XML中的特定节点。例如: ```java String expression = "/root/element[@attr='value']"; List<Element> elements = document...
在实际开发中,DOM4J常用于XML配置文件的读取、XML数据的交换、XML Web服务的客户端和服务端等场景。例如,在Spring框架中,DOM4J被用于解析配置文件,构建Bean的定义。通过理解并熟练使用DOM4J,开发者可以更高效地...
4. **使用**:在你的代码中导入DOM4J的类,如`org.dom4j.Document`、`org.dom4j.Element`等,然后使用提供的API进行XML操作。 DOM4J的核心功能包括: - **解析XML**:DOM4J支持SAX和DOM解析方式,可以根据需求选择...
这个压缩包包含了DOM4J的源代码和预编译的jar文件,对于开发者来说,这是一个宝贵的资源,可以深入理解DOM4J的工作原理,并在实际项目中方便地使用它。 首先,DOM4J的核心概念是Element,它代表了XML文档中的一个...
在Java中,DOM4J是一个强大的、灵活的处理XML的库,提供了全面的功能来读取、写入、修改XML文档。本教程将深入讲解如何使用DOM4J进行高效XML解析,并通过一个简单的DEMO程序进行演示。 首先,我们需要了解DOM4J的...
在"dom4jdemo"这个子文件夹中,很可能是包含了一个或多个Java源代码文件,演示了如何使用DOM4J进行XML操作的实例。这些代码通常会包含导入DOM4J库的语句,如`import org.dom4j.Document;`和`import org.dom4j....
【标题】"DOM4J格式化XML"是一个关于XML处理的专题,主要聚焦于使用DOM4J库对XML文档进行格式化的技术。DOM4J是一个非常流行的Java XML API,它提供了丰富的功能,包括读取、写入、修改以及操作XML文档。在XML处理中...
- **配置文件处理**:许多应用使用XML作为配置文件,DOM4J可以轻松解析和修改这些配置。 - **Web服务**:在SOAP等Web服务中,XML用于传输数据,DOM4J可用于处理响应。 - **文档生成**:生成动态的XML报告或文档。...
DOM4J在Java社区中被广泛使用,尤其是在那些需要处理大量XML数据的应用中。这个压缩包包含了一些核心的DOM4J相关文件,以及必要的依赖库,以便于在项目中集成并使用DOM4J进行XML操作。 1. **dom4j.jar**:这是DOM4J...
在Java中,Dom4J是一个流行的库,它提供了方便的API来解析和操作XML文档。本篇文章将深入探讨Dom4J库如何解析XML源代码,并介绍其在创建XML文件时的应用。 首先,让我们了解什么是DOM(Document Object Model)。...
《深入理解DOM4J——基于dom4j-1.6.1.zip的解析与应用》 DOM4J,作为Java领域中的一个强大的XML处理库,因其简单易用、功能全面的特点,深受广大开发者喜爱。本篇文章将围绕"dom4j-1.6.1.zip"这个压缩文件,深入...
DOM4J作为一个解析器,可以将XML文档转换为一个可操作的Java对象模型,方便我们进行数据的读取和写入。 在`Dom4jTest1.java`中,程序通常会包含以下步骤: 1. 引入DOM4J库:首先,我们需要在Java源代码中引入DOM4J...
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活且高效的API,使得XML的解析、创建、修改和查询变得简单。DOM4J的名字来源于“Document Object Model for Java”,但它并不仅仅是一个DOM实现,它还包含...
- **配置文件处理**:许多Java应用使用XML作为配置文件格式,DOM4J可以方便地读取和修改这些配置。 - **数据交换**:XML常用于不同系统间的数据交换,DOM4J可以帮助解析和构建这种数据格式。 - **Web服务**:在处理...
DOM4J-1.6.1.jar 和 XMLBeans-2.6.0.jar 是两个在Java开发中处理XML文档的库。它们各自提供了不同的方法来解析、操作和生成XML数据,尤其是在进行Excel导入导出这样的任务时,可能需要对XML进行复杂的操作。 DOM4J...
DOM4J是一个非常优秀的Java XML API,它提供了全面而强大的XML处理功能,包括读取、创建、修改和查询XML文档。这个压缩包“dom4j-1.6.1-API+源代码-中文版.rar”包含了DOM4J 1.6.1版本的中文API文档和带有中文注释的...
DOM4J是一个非常流行的Java XML处理库,它提供了丰富的API来读取、写入、修改以及处理XML文档。 描述中的“这是我从官网下的dom4j-2.0,不知符合大家的胃口”意味着这是从官方源获取的,通常官方源提供的文件是可靠...