h2数据库 xml-dom4j

前言

进公司实习干的第一件事,把一个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();
		    }
		  };	
        }	

上一篇:博客园添加多级目录


下一篇:博客园 --在博文中添加目录