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();
}
};
}