1. 程式人生 > 資料庫 >h2資料庫 xml-dom4j

h2資料庫 xml-dom4j

前言

進公司實習乾的第一件事,把一個H2資料庫內容提取出來並以xml格式儲存,以前從未接觸過,記錄一下程式碼和過程。


一、H2資料庫是什麼?

H2 是一個用 Java 開發的嵌入式資料庫,它本身只是一個類庫,即只有一個 jar 檔案,可以直接嵌入到應用專案中。最常使用的用途就在於可以同應用程式打包在一起釋出,這樣可以非常方便地儲存少量結構化資料。

(注意:一定要下載相同版本的,不然打不開,要是發現就是連不上,肯定是版本錯了。)

二、使用步驟

1.資源



(jdom和dom4j只能用一個)

相關方法:
一.Document物件相關
1.讀取XML檔案,獲得document物件.

SAXReader reader = new SAXReader();

Document document = reader.read(new File(“input.xml”));

2.主動建立document物件.

Document document = DocumentHelper.createDocument();
Element root = document.addElement(“members”);// 建立根節點

二.節點相關、
1.獲取文件的根節點.

Element rootElm = document.getRootElement();

2.取得某節點的單個子節點.

Element memberElm=root.element(“member”);// "member"是節點名

3.取得節點的文字

String text=memberElm.getText();
也可以用:
String text=root.elementText(“name”);這個是取得根節點下的name子節點的文字.

4.取得某節點下名為"member"的所有位元組點並進行遍歷.

取根節點下所有子節點的集合:
List nodes = rootElm.elements(“member”);
for (Iterator it = nodes.iterator(); it.hasNext(); ) {
Element elm = (Element) it.next();
// do something

}

5.在某節點下新增子節點.

Element ageElm = newMemberElm.addElement(“age”);

6.設定節點文字.

ageElm.setText(“29”);
ageElm.addCDATA(str); //文字加上CDATA進行保護

7.刪除某節點.

parentElm.remove(childElm);// childElm是待刪除的節點,parentElm是其父節點

三.屬性相關.
1.取得某節點下的某屬性

Element root=document.getRootElement();
Attribute attribute=root.attribute(“size”);// 屬性名name

2.取得屬性的文字

String text=attribute.getText();
也可以用:
String text2=root.element(“name”).attributeValue(“firstname”);這個是取得根節點下name子節點的屬性firstname的值.

3.遍歷某節點的所有屬性

Element root=document.getRootElement();
for(Iterator it=root.attributeIterator();it.hasNext(); ){
Attribute attribute = (Attribute) it.next();
String text=attribute.getText();
System.out.println(text);
}

4.設定某節點的屬性和文字.

newMemberElm.addAttribute(“name”, “sitinspring”);

5.設定屬性的文字

Attribute attribute=root.attribute(“name”);
attribute.setText(“sitinspring”);

6.刪除某屬性

Attribute attribute=root.attribute(“size”);// 屬性名name
root.remove(attribute);

四.將文件寫入XML檔案.
1.文件中全為英文,不設定編碼,直接寫入的形式.

XMLWriter writer = new XMLWriter(new FileWriter(“output.xml”));
writer.write(document);
writer.close();

2.文件中含有中文,設定編碼格式寫入的形式.

OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding(“GBK”); // 指定XML編碼
XMLWriter writer = new XMLWriter(new FileWriter(“output.xml”),format);
writer.write(document);
writer.close();

2.程式碼

提取寫入:

    // 資料庫連線URL,當前連線的是E:/H2目錄下的gacl資料庫
	private static final String JDBC_URL = "jdbc:h2:F:/tool-cc/prdl-rulesdb";
	// 連線資料庫時使用的使用者名稱
	private static final String USER = "";
	// 連線資料庫時使用的密碼
	private static final String PASSWORD = "";
	// 連線H2資料庫時使用的驅動類,org.h2.Driver這個類是由H2資料庫自己提供的,在H2資料庫的jar包中可以找到
	private static final String DRIVER_CLASS = "org.h2.Driver";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 資料庫連線
		Statement stmt = null; // 資料庫操作
		ResultSet rs = null; // 儲存查詢結果
		String sql = "SELECT * FROM RULE"; // 要執行的SQL語句,從RULE表中查詢所有資料

		try {
			Class.forName(DRIVER_CLASS).newInstance(); // 載入驅動程式
			System.out.println("載入驅動程式成功!");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

		try {
			conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
			System.out.println("連線資料庫!");
			if (!conn.isClosed()) {
				System.out.println("Succeeded connecting to the Database!");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}

		System.out.println(conn);

		try {
			stmt = conn.createStatement(); // 建立statement類物件,用來執行SQL語句
		} catch (SQLException e) {
			e.printStackTrace();
		}

		try {
			rs = stmt.executeQuery(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}

		String fileName = "D://RULE.xml";  		  
	    Document document = DocumentHelper.createDocument();// 建立document物件,用來操作xml檔案 
	    Element root = document.addElement("prdl-rulesdb");
	    while(rs.next()) {
	    	String id = rs.getString("NAME"); // 取得id內容
	 		int level = rs.getInt("SEVERITY") + 1; // 取得level內容
	 		String html = rs.getString("SPEC"); // 取得html內容
	 		String prdl = rs.getString("PRDL"); // 取得prdl內容
	 	    // 建立根節點  	    	  
	 	    Element table = root.addElement("RULE"); 
	 	    
	 	    Element did = table.addElement("id");  
	 	    did.setText(id);
	 	    Element dlevel = table.addElement("lever"); 
	 	    dlevel.setText(String.valueOf(level));
	 	    Element dhtml = table.addElement("html");  
	 	    dhtml.addCDATA(html);
	 	    Element dprdl = table.addElement("prdl"); 
	 	    dprdl.addCDATA(prdl);
	 	    
	 	   String regEx1 = "^*+\\.+\\d+\\.+\\d";
	 	   Pattern pattern1 = Pattern.compile(regEx1);
	 	   Matcher matcher1 = pattern1.matcher(id);
	 	   boolean r1 = matcher1.find();
	 	   if(r1) {
	 		  table.addAttribute("id", "GJB_5369");
	 	   }
	 	   
	 	   String regEx2 = "MISRA*";
	 	   Pattern pattern2 = Pattern.compile(regEx2);
	 	   Matcher matcher2 = pattern2.matcher(id);
	 	   boolean r2 = matcher2.find();
	 	   if(r2) {
	 		  table.addAttribute("id", "MISRA");
	 	   }
	 	   
	 	   String regEx3 = "SJT*";
	 	   Pattern pattern3 = Pattern.compile(regEx3);
	 	   Matcher matcher3 = pattern3.matcher(id);
	 	   boolean r3 = matcher3.find();
	 	   if(r3) {
	 		  table.addAttribute("id", "SJT");
	 	   }	 	   
	    }
	    OutputFormat xmlFormat = OutputFormat.createPrettyPrint();
	    xmlFormat.setEncoding("utf-8");
	    XMLWriter writer = new XMLWriter(new FileOutputStream(new File(fileName)), xmlFormat);
	    writer.write(document);
	    writer.close();
		try {
			conn.close(); // 關閉資料庫
		} catch (SQLException e) {
			e.printStackTrace();
		}
		rs.close();
	}

xml去重:

SAXReader reader = new SAXReader();
		Document  document = reader.read(new File("D://RULEa.xml"));
		//取根節點
		Element rootElm = document.getRootElement();
		
		List<Element> rules=rootElm.elements();
		
		for (int i = 0; i < rules.size()-1; i++)
        {
			Element rule = (Element) rules.get(i);
			Element eid=rule.element("id");
            String id = eid.getText();
            for (int j = i + 1; j < rules.size(); j++)
            {
            	Element rule_next = (Element) rules.get(j);
            	Element eid_next=rule_next.element("id");
                String id_next = eid_next.getText();
                if (id.equals(id_next))
                {
                	rootElm.remove(rule_next);
                }
            }
        }  		
		XMLWriter writer=null;		  
		OutputFormat format=OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");
		FileOutputStream fos=new FileOutputStream(new File("D://RULEb.xml"));
		writer=new XMLWriter(fos,format);
		writer.write(document);
		if(writer!=null){
		    try{
		     writer.close();
		    }catch(IOException e){
		     e.printStackTrace();
		    }
		  };	
        }