深入浅出Java Dom4j读取XML
在以前自己使用的xml较少,只是了解其很强大,现在可算是在DRP中,真正的开始使用它了,以前只是简单的理解xml,xml即可扩展标记语言,简单的使用,具体是什么?怎么用?还是一直让自己期待的.
首先来看一下xml的强大的作用
一、兼容现有协议
二、统一的管理数据存取格式
三、不同应用系统间数据的共享和交互
四、底层传输的数据更具可读性
五、它和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的更多相关文章
- Java DOM4J读取XML
DOM4J是dom4j.org出品的一个开源XML解析包.Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,採用了Java集合框架并全然支持DOM,SAX和JA ...
- java DOM4J 读取XML
最近学习Java,在处理XML文档的时候,查阅相关资料,发现了DOM4J这个jre库,相对C#的XML处理来说,功能还算是跟得上 下面展示一篇我自己写的一个XML读取测试 import java.ut ...
- Java使用dom4j读取xml时报错:org.dom4j.DocumentException: Error on line 2 of document : Invalid byte 2 of 2-byte UTF-8 sequence. Nested exception: Invalid byte 2 of 2-byte UTF-8 sequence
1.Java使用dom4j读取xml时报错: org.dom4j.DocumentException: Error on line 2 of document : Invalid byte 2 of ...
- RSS阅读器(一)——dom4j读取xml(opml)文件
接触java不久,偶有收获,最近想做一个web版RSS阅读器来锻炼一下.手头有几个从不同版本的foxmail中导出的opml文件,大家应该都知道,opml文件就是xml格式的.那么就先从这里入手,练习 ...
- 使用dom4j 读取XML文件
第一次接触dom4j的时候,感觉这个东西很神秘,因为之前虽然知道XML文件吧,但从来没有用过,一直感觉XML肯定不好操作.当得知,dom4j可以很容易的操作读取XML文件时,不免有些好奇,那么,用do ...
- DOM4J读取XML文件
最近在做DRP的项目,其中涉及到了读取配置文件,用到了DOM4J,由于是刚开始接触这种读取xml文件的技术,好奇心是难免的,于是在网上又找了一些资料,这里就结合找到的资料来谈一下读取xml文件的4中方 ...
- java Domj4读取xml文件
先概括,再以代码形式给出. 获取节点: Iterator Element.nodeIterator(); //获取当前标签节点下的所有子节点 获取 标签: Element Document.get ...
- 【XML】利用Dom4j读取XML文档以及写入XML文档
Dom4j简介 dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,它的性能 ...
- 使用dom4j读取xml连接数据库与之单例模式
使用dom4j读取xml ,加入jar包 dom4j-1.6.1.jar jaxen-1.1-beta-6.jar public class XmlConfigReader { //懒汉式,延迟加载 ...
随机推荐
- ubuntu 系统应用安装方式
转载 ubuntu系统软件安装 来源:http://www.linuxidc.com/Linux/2011-02/32211.htm 首先说明一下 ubuntu 的软件安装大概有几种方式:1. d ...
- RabbitMQ-Spring AMQP
上篇文章RabbitMQ基础入门学习了rabbitMQ一些基础的api,当然spring也在原生代码的基础上做了更多的封装,这篇文章就基于spring-rabbit,学习一下spring的实现. p. ...
- Mysql优化--Show Profile
Mysql 系列文章主页 =============== 是Mysql提供可以用来分析当前会话中语句执行的资源消耗情况.可以用于Sql的调优的测量.默认情况下处于关闭状态,并保存最近 15 次的运行结 ...
- MockHttpServletRequestBuilder中content和param的区别
结论: Mock将URL的参数和通过使用param添加的参数添加到request中的parameter中(url参数) 而将content内容.类型并没有进行解析,直接添加到request的conte ...
- JVM Class详解之一
首先看Class中包含哪些信息简单的说所有Java文件中有的信息class文件都有,编译器帮我们将java文件转化成了JVM能看懂的class格式而已 Class 概述 Class文件是一组以8位字节 ...
- 3.2 2-dim Vector Initialization
声明3行4列的数组 const int m = 3, n = 4; vector<vector<int> > A(m); // 3 rows for(int i = 0; i ...
- ORACLE设置自启动记录
设置开机自启动1. 修改Oracle系统配置文件:/etc/oratab,只有这样,Oracle 自带的dbstart和dbshut才能够发挥作用.[root@hailiang ~]# vi /etc ...
- eclipse安装和配置Gradle插件
配置: 首先下载Gradle:https://gradle.org/gradle-download/ 设置Gradle环境变量: GRADLE_HOME %GRADLE_HOME%\bin" ...
- Minimize the error CodeForces - 960B
You are given two arrays A and B, each of size n. The error, E, between these two arrays is defined ...
- Docker基本架构
Docker 采用了 C/S架构,包括客户端和服务端. Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建.运行.分发容器). 客户端和服务端既可以运行在一个机器上,也可通 ...