引言
xml是我们在项目开发中经常用到的一个东西,我们将一些比较容易改变的东西配置在xml文件里面,方便以后改变,尤其是我们的系统部署以后。那么我们就需要掌握一门技术来读取xml文件中的内容,在java学习中小编采用dom4j来是先xml文件的读取,dom4j就是一个读取java的xml文件非常好的API,里面非常多的用法需要我们查询他的官方文档就就可以了,下面小编分享一下在想中用到的东西。
一、读取数据库的配置信息
将数据库的相关信息配置在xml文件中。
在我们利用dom4j之前,需要在项目中引入dom4j-1.6.1.jar和jaxen-1.1-beta-6.jar两个jar包。
<?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:databaseName</url> <user-name>userName</user-name> <password>password</password> </db-info> </config>
利用单利模式+dom4j解析xml文件中的内容
package com.bjpowernode.drp.util; import java.io.InputStream; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import com.sun.org.apache.bcel.internal.generic.NEW; public class XmlConfigReader { /** * 单利模式模式解析sys-config.xml文件 * @param args */ //饿汉式(预先加载) /*private static XmlConfigReader instance = new XmlConfigReader(); private XmlConfigReader(){ } public static XmlConfigReader getInstance(){ return instance; } */ //懒汉式(延迟加载) private static XmlConfigReader instance=null; private JdbcConfig jdbcConfig=new JdbcConfig(); private XmlConfigReader(){ SAXReader reader = new SAXReader(); InputStream in = Thread.currentThread().getContextClassLoader() .getResourceAsStream("sys-config.xml"); try { Document doc = reader.read(in); 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"); //设置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; } }
上面的用法几乎在我们每个项目中都会出现,因为这样我们在更换服务器的时候会非常的灵活。
二、读取xml文件信息
有时候我们会遇到这样的需求,需要我们在项目中将一个xml文件中信息解析并且存储在数据库中,那么这时候就需要我们认真分析xml文件中的层级关系,然后利用dom4j进行解析。
下面是一个测试的xml文件中的内容
<?xml version="1.0" encoding="utf-8"?> <ACCESOS> <item> <SOCIO> <NUMERO>00045050</NUMERO> <REPOSICION>0</REPOSICION> <NOMBRE>MOISES MORENO</NOMBRE> <TURNOS> <LU>T1</LU> <MA>T2</MA> <MI>T3</MI> <JU>T4</JU> <VI>T5</VI> <SA>T6</SA> <DO>T7</DO> </TURNOS> </SOCIO> </item> <item> <SOCIO> <NUMERO>00045051</NUMERO> <REPOSICION>0</REPOSICION> <NOMBRE>RUTH PENA</NOMBRE> <TURNOS> <LU>S1</LU> <MA>S2</MA> <MI>S3</MI> <JU>S4</JU> <VI>S5</VI> <SA>S6</SA> <DO>S7</DO> </TURNOS> </SOCIO> </item> </ACCESOS>
通过观察我们会发现,上面xml文件的内容如果放在数据库中的话,我们只需要将节点 <SOCIO></SOCIO>中的四个节点作为我们数据库中的字段名称即可,这样我们通过dom4j解析以后存放在数据库中。
package com.bjprowernode.xml; import java.io.File; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class TestXMLImport { /** * @param args */ public static void main(String[] args) { String sql="insert into T_XML(NUMERO, REPOSICION, NOMBRE, TURNOS) values (?, ?, ?, ?)"; Connection conn=null; PreparedStatement pstmt= null; try { conn=DbUtil.getConnection(); pstmt = conn.prepareStatement(sql); Document doc= new SAXReader().read(new File("G:/myeclipseWorkSpace/test_xmlImport/xml/test01.XML")); List itemList = doc.selectNodes("/ACCESOS/item/SOCIO"); for (Iterator iter=itemList.iterator();iter.hasNext();) { Element el = (Element)iter.next(); String numero = el.elementText("NUMERO"); String reposicion = el.elementText("REPOSICION"); String nombre = el.elementText("NOMBRE"); List turnosList = el.elements("TURNOS"); StringBuffer sbString = new StringBuffer(); for (Iterator iter1=turnosList.iterator(); iter1.hasNext();) { Element turnosElt = (Element)iter1.next(); String lu = turnosElt.elementText("LU"); String ma = turnosElt.elementText("MA"); String mi = turnosElt.elementText("MI"); String ju = turnosElt.elementText("JU"); String vi = turnosElt.elementText("VI"); String sa = turnosElt.elementText("SA"); String doo = turnosElt.elementText("DO"); sbString.append(lu + "," + ma + "," + mi + "," + ju + "," + vi + "," + sa + "," + doo); } pstmt.setString(1, numero); pstmt.setString(2, reposicion); pstmt.setString(3, nombre); pstmt.setString(4, sbString.toString()); pstmt.addBatch(); } pstmt.executeBatch(); System.out.println("将XML导入数据库成功!"); } catch (DocumentException | SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DbUtil.close(pstmt); DbUtil.close(conn); } } }
上面就完成了一个小demo利用dom4j读取java中的xml文件中的内容,其中很多的用法需要查询API文档,多用一些到时候自然会熟悉一点。