1. 程式人生 > >用dom4j讀取xml到資料庫

用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資料庫

一、XML知多少   對它最好的描述是:它是獨立於軟體和硬體的資訊傳輸工具。其實它是對一組規範的封裝集合,在它的領域裡,只要滿足規則,就可以傳輸。它的宗旨是傳輸資料,而不是顯示資料(html應該是顯示資料)。只要弄清楚這個前提,具體的規範不是問題。<詳見百科>

dom4j實現xml操作

要匯入的包: dom4jUtil.java package utils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import or

DOM4J進行xml檔案 字串 Document之間的轉換

1、xml文件或節點轉換為字串 //xml文件或節點轉換為字串 @Test public void test5()throws Exception{ //建立SAXReader物件 SAXReader read

php讀取xml資料

今天工作上碰到一個問題 由於我們的專案資料太少 所以需要從web search那邊借調資料,他們只給我們提供了一個xml的介面。因此,我們需要把xml的資料轉化成html呈現給大家。由於專案是基於php的,所以就摒棄了用js來讀取xml選擇了繼續使用php。不過,我以前從來沒有做過此類的嘗試 所以找

linux下dom4j寫入xml時 報錯java.io.FileNotFoundException..(沒有那個檔案或目錄

今天在使用dom4j寫入xml檔案是報錯:java.io.FileNotFoundException..(沒有那個檔案或目錄) 但是我去讀取檔案時卻是正常的,這時我想到了linux下的許可權問題,所一我改了許可權,再試,還是這個錯誤,百度一下,發現這種錯誤大多是路徑不對或者

把Json轉Xml並且xpath讀取xml元素(JAVA)

maven <dependency> <groupId>net.sf.json-lib</groupId> <artifactId

c++讀取xml檔案時,執行時出現以下錯誤:出現未處理的“System.Xml.XmlException”型別的異常出現在 system.xml.dll 中

各位高手,我剛剛開始接觸c++,使用的是Microsoft Visual Studio 2003版本,在使用c++讀取xml檔案時,編譯已經通過,但是執行.exe程式時,老是出現這個錯誤:“未處理的“System.Xml.XmlException”型別的異常出現在 syste

Dom4J讀取XML檔案時出現的connection timed out:connect Nested exception異常解決方法

最近在專案中實現一個雙資料庫的動態讀取樹形選單功能,通過了Dom4J來實現,執行過程中出現以下問題: 在本論壇查到原因為 dom4j會去拿DTD增加那些DOCTYPE的預設屬性,因此加入下面一段話即可。 解決辦法連結http://topic.csdn.ne

jdom或dom4j讀取xml檔案時如何讓dtd驗證使用本地dtd檔案或者不生效

一、寫在所有之前: 因為dom4j和jdom在這個問題上處理的方法是一模一樣的,只是一個是SAXBuilder 一個SAXReader,這裡以jdom距離,至於dom4j只需要同理替換一下就可以了。 二、問題發生的情況 當你用jdom讀取一個有 dtd驗證的xml檔案,同時

dom4j解析xml檔案寫入記事本時,解決換行問題

  }  try  {        OutputFormat   format  = new OutputFormat("  ",true);    format.setLineSeparator("/n/r");       XMLWriter xmlWriter = new XMLWriter(new

python讀取xml資料庫中表內所有資料,獲取資料庫中所有表的欄位名稱

工作中需要讀取指定xml資料庫中的資料以及 表所需欄位名,所以在已有例子中改進實現: xml 資料庫 xmldabase.xml: <database> <manifest> <pair key="schema_major_vsn" v

jdom 或 dom4j讀取xml檔案時如何讓dtd驗證使用本地dtd檔案或者不生效

一、寫在所有之前:因為dom4j和jdom在這個問題上處理的方法是一模一樣的,只是一個是SAXBuilder 一個SAXReader,這裡以jdom距離,至於dom4j只需要同理替換一下就可以了。二、問題發生的情況當你用jdom讀取一個有dtd驗證的xml檔案,同時你的網路是

使用DOM4J讀取XML檔案

xml 檔案: <?xml version="1.0" encoding="utf-8" ?> <Response> <e> <CLASS

使用dom4j 讀取xml檔案時的中文問題(轉)

使用dom4j 讀取xml檔案時的中文問題:(一) 在用reader.read(String filename)傳遞的是檔名的時候,遇到中文的路徑則會出錯,丟擲unknow protocol :d異常.而使用英文名則不存在該錯誤.解決辦法: 用 reader.read(new File(filename))

【python】在dom讀取xml文件的文檔對象、元素對象的類型(的type())時 出現<type 'instance'> 而不是具體類型時?

一個 tps env ldo article err sin https type 參考 【獲取python對象的類型名字 不希望全都只顯示<type ‘instance‘>?】 【type() 和 isinstance() 的區別】 【python中

【java】xml檔案表建立及讀取環境搭建並採用DOM4J完成XML檔案匯入到資料庫

    java一種簡單的解析xml方法是用DOM進行解析, dom4j是一個Java的XML API,類似於jdom,用來讀寫XML檔案的,dom4j用於處理xml是很常用的技術,本篇部落格介紹xml檔案表建立及讀取環境搭建並採用DOM4J完成XML檔案匯入到資料庫。

使用dom4j技術來讀取xml中的信息。

XML首先根據xml路徑獲取到xml的流文件然後新建一個SAXReader對象使用SAXReader對象使用read方法讀取到xml獲得document文檔通過document文檔獲取到根節點getRootElemnet()然後通過根節點的遍歷方法獲得遍歷後的集合elementIterator();遍歷集合將

使用dataset讀取xmldataview排序時為什麽不是按數字類型排序 MQsz

父親 dataview 重要 找我 con 帶來 權力 view 尋找 <p>  秋天,葉子一片片落下,帶著一絲絲的遺憾,投向大地母親的懷抱。她們跳躍著,旋轉,著,輕舞飛揚著,翩然落下。仲春時節,輕寒料峭。一個朋友的父親專程從鄉下來縣城看我,他給我帶來了滿滿的一

利用反射與dom4j讀取javabean生成對應XML讀取XML得到對應的javabean物件集合

首先實現生成對應的JAVAbean的XML檔案方法 /** * DMO4J寫入XML * @param obj 泛型物件 * @param entityPropertys 泛型物件的List集合 * @param Encode

dom4j讀取兩個xml檔案 然後 copy

package chapter; import java.io.File; import java.io.FileWriter; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.