深入浅出Java Dom4j读取XML

    在以前自己使用的xml较少,只是了解其很强大,现在可算是在DRP中,真正的开始使用它了,以前只是简单的理解xml,xml即可扩展标记语言,简单的使用,具体是什么?怎么用?还是一直让自己期待的.


首先来看一下xml的强大的作用


一、兼容现有协议


    XML文档格式的管理信息可以很容易地通过HTTP 协议传输,由于HTTP是建立在TCP之上的,故管理数据能够可靠传输。XML还支持访问XML文档的标准API,如DOM,SAX,XSLT,Xpath等。

二、统一的管理数据存取格式

    XML能够以灵活有效的方式定义管理信息的结构。以XML格式存储的数据不仅有良好的内在结构,而且由于它是W3C提出的国际标准,因而受到广大软件提供商的支持,易于进行数据交流和开发。现有网络管理标准如TMN、SNMP等的管理信息库规范决定了网管数据符合层次结构和面向对象原则,这使得以XML格式存储网管数据也非常自然,易于实现。


三、不同应用系统间数据的共享和交互


    只要定义一套描述各项管理数据和管理功能的XML语言,用Schema对这套语言进行规定,并且共享这些数据的系统的XML文档遵从这些Schema,那么管理数据和管理功能就可以在多个应用系统之间共享和交互。

四、底层传输的数据更具可读性

    网络中传输的底层数据因协议不同而编码规则不同,虽然最终传输时都是二进制位流,但是不同的应用协议需要提供不同的转换机制。这种情况导致管理站在对采用不同协议发送管理信息的被管对象之间进行管理时很难实现兼容。如果协议在数据表示时都采用XML格式进行描述,这样网络之间传递的都是简单的字符流,可以通过相同的XML解析器进行解析,然后根据不同的XML标记,对数据的不同部分进行区分处理,使底层数据更具可读性。[4]



五、它和json都是一种数据交换格式

    在不同的数据库与系统间的交互,数据的相互共享其解决了很大的问题,不同语言开发的系统也可以使用xml来共享数据;

    xml可以当然数据库的表,来存储数据,因为其都有一定的结构,结点,分层次的,很有规律,这样我们以前来回传递数据可以借鉴xml来实现……


    既然xml的作用这么重要,如何解析xml、数据库的数据取出来生成xml,这是首要解决的问题,结合在DRP中,为了实现数据库的地址、用户名、密码都是灵活的通过xml来获取,显然系统后期的维护与修改显得很轻松。


Dom4j是什么?

    Dom4j是一个易于使用的,开源的库,在Java平台上与XML,XPath,XSLT协同工作。使用Java集合框架,全面支持DOM,SAX,JAXP。

    dom4j是一个Java的XMLAPI,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的JavaXMLAPI,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。


Dom4j实例解析XML


要读取解析的xml文件:sys-config.xml



<?xml version="1.0" encoding="UTF-8"?>
<config>
		<db-info>
			<driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
			
			<url>jdbc:oracle:thin:@127.0.0.1:1521:ORCL</url>		
			<user-name>sys</user-name>
			<password>sys</password>
		</db-info>
</config>


读取xml文件的类:XmlConfigReader.java


    读写XML文档主要依赖于org.dom4j.io包,其中提供DOMReader和SAXReader两类不同方式,而调用方式是一样的。这就是依靠接口的好处。
import java.io.InputStream;

//引用相应的包

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;


读取xml的java类:XmlConfigReader


    代码中reader的read方法是重载的,可以通过InputStream, File, Url等不同的参数来读取,通过单例模式生成一个对象,这个对象实例化一个SAXReader,然后将xml文件加载到流当中。再通过SAXReader的read()方法将其转换成一个document对象。然后通过这个document对象取到xml文件的节点的值。


package conn.lishehe.drp.util;

import java.io.InputStream;

//引用相应的包

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class XmlConfigReader {
	//懒汉式 
	private static XmlConfigReader instance = null;
	//保存jdbc相关配置信息的
	private JdbcConfig jdbcConfig = new JdbcConfig();
	
	private XmlConfigReader(){
		//建立一个SAXReader对象 
		SAXReader reader = new SAXReader();
		//通过当前线程的类加载器,获得文件的相对路径,读入缓冲输入流 
		InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");
		try {
			//取得jdbc相关配置信息
			//通过流来读取xml文件  
			Document doc =  reader.read(in);
			//读取jdbc相关信息
			//Element:用于描述XML文档中的元素。
			Element driverNameElt = (Element)doc.selectObject("/config/db-info/driver-name");
			Element urlElt = (Element)doc.selectObject("/config/db-info/url");
			Element userNameElt = (Element)doc.selectObject("/config/db-info/user-name");
			Element passwordElt = (Element)doc.selectObject("/config/db-info/password");
			
			
			/*String driverName = driverNameElt.getStringValue();
			String url = urlElt.getStringValue();
			String userName = userNameElt.getStringValue();
			@SuppressWarnings("unused")
			String password = passwordElt.getStringValue();
				
			System.out.println(driverName);*/
			
			
			//取得jdbc相关的配置
			jdbcConfig.setDriverName(driverNameElt.getStringValue());
			jdbcConfig.setUrl(urlElt.getStringValue());
			jdbcConfig.setUserName(userNameElt.getStringValue());
			jdbcConfig.setPassword(passwordElt.getStringValue());
		
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static synchronized XmlConfigReader getInstance(){
		if(instance == null){
			instance = new XmlConfigReader();
			
		}
		return instance;
		
	}
	/**
	 * 返回jdbc相关配置
	 * @return
	 */
	public JdbcConfig getJdbcConfig(){
		return jdbcConfig;
	}
		
	
	
	public static void main(String[] args){
	
		JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();
	/*System.out.println(jdbcConfig.getDriverName());
	System.out.println(jdbcConfig.getUrl());
	System.out.println(jdbcConfig.getUserName());*/
	System.out.println(jdbcConfig);
	}
}

定义的实体集的类:JdbcConfig.java



package conn.lishehe.drp.util;
/**
 * Jdbc
 * @author lishe
 *
 */
public class JdbcConfig {
	
	private String driverName;
	public String getDriverName() {
		return driverName;
	}
	public void setDriverName(String driverName) {
		this.driverName = driverName;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	private String url;
	private String userName;
	private String password;
	@Override
	public String toString() {
		return this.getClass().getCanonicalName() + "{driverName:" + driverName + ", url:" + url + ", userName:" + userName + "}";
	}

}

数据处理层:DbUtil.java


package conn.lishehe.drp.util;

import java.sql.Connection;
import java.sql.DriverManager;

/**
 * 封装数据库常用操作
 * @author 李社河
 */
public class DbUtil {
	/**
	 * 取得Connection
	 * @return
	 * @throws ClassNotFoundException 
	 */
	public static Connection getConnection() throws ClassNotFoundException{
	/*	Connection conn = null;
	try {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
		String username = "";
		String password = "";
		conn = DriverManager.getConnection(url, username,password);
		
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
		return conn;*/
		Connection conn = null;
		try {
			JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();
			Class.forName(jdbcConfig.getDriverName());

			conn = DriverManager.getConnection(jdbcConfig.getUrl(), jdbcConfig.getUserName(),jdbcConfig.getPassword());
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
			return conn;
		
	}
	public static void main(String[] args){
		try {
			//测试获取到相应的配置文件的信息,打出来
			System.out.println(DbUtil.getConnection());
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
		

}

执行结果:

 

当然另外值得一提的是DOM4J对XPath有良好的支持,如访问一个节点,可直接用XPath选择

   

//Element:用于描述XML文档中的元素。
			Element driverNameElt = (Element)doc.selectObject("/config/db-info/driver-name");
			Element urlElt = (Element)doc.selectObject("/config/db-info/url");

   这里使用的是selectObject方法,此方法返回找到的第一个匹配节点,如果没有匹配的节点就返回 null。XPath更像一种选择器,只要你给出条件即可。


总结


    通过以上的一些方法,我们可以得到XML整个文档、文档的根节点、符合某个条件的所有节点以及单独拿到某个节点,都是可以的,这样xml带给系统的灵活性是非常强大的,Dom4j使得Java读取XML文件更加的方便,更加的快捷,效率更高,联系到项目中可以把相应的页面信息在数据库的地址,读取成xml文件,在权限的基础上来判定加载相应的结点,生产相应的权限树是不错的选择啊……这样联系想起来又勾起了我做项目的冲动哈!

你可能感兴趣的:(深入浅出Java Dom4j读取XML)