一、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>
2、读取xml的Java类:
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还是很有优势的。
总结一下心得:用过才知道它的强大!