前言
进公司实习干的第一件事,把一个H2数据库内容提取出来并以xml格式保存,以前从未接触过,记录一下代码和过程。
一、H2数据库是什么?
H2 是一个用 Java 开发的嵌入式数据库,它本身只是一个类库,即只有一个 jar 文件,可以直接嵌入到应用项目中。最常使用的用途就在于可以同应用程序打包在一起发布,这样可以非常方便地存储少量结构化数据。
h2下载地址(注意:一定要下载相同版本的,不然打不开,要是发现就是连不上,肯定是版本错了。)
二、使用步骤
1.资源
JDOM包下载地址
DOM4J包下载地址
(jdom和dom4j只能用一个)
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();
}
};
}