用dom4j读取xml到数据库

一、XML知多少

  对它最好的描述是:它是独立于软件和硬件的信息传输工具。其实它是对一组规范的封装集合,在它的领域里,只要满足规则,就可以传输。它的宗旨是传输数据,而不是显示数据(html应该是显示数据)。只要弄清楚这个前提,具体的规范不是问题。<详见百科>

 

二、Dom4j

  dom4j是一个JavaXML API,类似于jdom,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连SunJAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。 

 

三、读取XML的方式

  1DOM:它是面向模型的,一次将xml文档加入内存,编程简单,适合小型文件的解析;

2SAX:全称stream API for XML。把xml文档作为一个流来处理,就像java IO中的流的概念。它是面向事件的,不像dom一次性加载xml文档,它是像Java读写一般文件一样,读一部分解析一部分,内存占用就比较少。然而效率的代价是易用性的降低,流式解析编程较为复杂,程序员需要负责更多的操作。并且由于应用程序没有以任何方式存储数据,所以使得更改数据或在数据流中往后移是不可能的。再加上它的单遍解析特性,意味着它也不支持随机访问。它适合大型文件的解析。

3JDOM:类似于DOM,性能上稍差,暂时不介绍了。

4dom4j

  提出一个问题:解析xml的底层接口原本只有dom和sax两种方式是吗?后来才又再这个底层的基础上封装了jdom和dom4j吗?Dom4j综合应用了domsax两种方式。

  

四、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);  
		}  
	}
}


3、效果展示



4、问题:

  还对应开始的问题,dom4j中的SAXReader(),它不就是一种sax流式读取吗?

  pstmt.executeUpdate()和pstmt.executeBatch()区别?pstmt.executeUpdate() 是一条一条发往数据库执行,时间都消耗在数据库连接的传输上面。而executeBatch是装载了所有的sql语句,一次送到数据库执行,执行需要很短的时间。所以再数据量大的时候,executeBatch还是很有优势的。


  总结一下心得:用过才知道它的强大!




你可能感兴趣的:(用dom4j读取xml到数据库)