一、XML知多少
对它最好的描述是:它是独立于软件和硬件的信息传输工具。其实它是对一组规范的封装集合,在它的领域里,只要满足规则,就可以传输。它的宗旨是传输数据,而不是显示数据(html应该是显示数据)。只要弄清楚这个前提,具体的规范不是问题。<详见百科>
二、Dom4j
dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。
三、读取XML的方式
1、DOM:它是面向模型的,一次将xml文档加入内存,编程简单,适合小型文件的解析;
2、SAX:全称stream API for XML。把xml文档作为一个流来处理,就像java IO中的流的概念。它是面向事件的,不像dom一次性加载xml文档,它是像Java读写一般文件一样,读一部分解析一部分,内存占用就比较少。然而效率的代价是易用性的降低,流式解析编程较为复杂,程序员需要负责更多的操作。并且由于应用程序没有以任何方式存储数据,所以使得更改数据或在数据流中往后移是不可能的。再加上它的单遍解析特性,意味着它也不支持随机访问。它适合大型文件的解析。
3、JDOM:类似于DOM,性能上稍差,暂时不介绍了。
4、dom4j:
提出一个问题:解析xml的底层接口原本只有dom和sax两种方式是吗?后来才又再这个底层的基础上封装了jdom和dom4j吗?Dom4j综合应用了dom和sax两种方式。
四、Dom4j读取XML实例
1、xml文件test01.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>
package com.drp.xml; import java.io.File; import java.sql.Connection; import java.sql.PreparedStatement; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class TestXMLImport { 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); //读取xml文件,按路径读取,获得document对象 Document doc = new SAXReader().read(new File("D:/java/MyEclipse 10/test_xmlImport/xml/test01.XML")); //选择xml文件的节点 List itemList = doc.selectNodes("/ACCESOS/item/SOCIO"); //遍历读出的xml中的节点 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"); //遍历TURNOS节点中的内容 List turnosList = el.elements("TURNOS"); StringBuffer sbString = new StringBuffer(); for (Iterator iterator = turnosList.iterator(); iterator .hasNext();) { Element turnosElt = (Element) iterator.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); } //为sql语句赋值 pstmt.setString(1, numero); pstmt.setString(2, reposicion); pstmt.setString(3, nombre); pstmt.setString(4, sbString.toString()); pstmt.addBatch(); } //批量执行sql语句 pstmt.executeBatch(); System.out.print("将XML导入数据库成功"); } catch (Exception e) { e.printStackTrace(); }finally{ DbUtil.close(pstmt); DbUtil.close(conn); } } }
4、问题:
还对应开始的问题,dom4j中的SAXReader(),它不就是一种sax流式读取吗?
pstmt.executeUpdate()和pstmt.executeBatch()区别?pstmt.executeUpdate() 是一条一条发往数据库执行,时间都消耗在数据库连接的传输上面。而executeBatch是装载了所有的sql语句,一次送到数据库执行,执行需要很短的时间。所以再数据量大的时候,executeBatch还是很有优势的。
总结一下心得:用过才知道它的强大!