要解析的xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE dblp SYSTEM "dblp.dtd">
<dblp><article mdate="2017-05-11" key="journals/ijtm/LuMW10">
<author>Iuan-Yuan Lu</author>
<author>Chih-Jen Mao</author>
<author>Chun-Hsien Wang</author>
<title>Intrafirm technology and knowledge transfer: a best practice perspective.</title>
<pages>338-356</pages>
<year>2010</year>
<volume>49</volume>
<journal>IJTM</journal>
<number>4</number>
<ee>https://doi.org/10.1504/IJTM.2010.030162</ee>
<url>db/journals/ijtm/ijtm49.html#LuMW10</url>
</article>
........
........
........
</article>
</dblp>
Article实体类:
package sax;
public class Article {
private String author;
private String title;
private String pages;
private Integer year;
private Integer volume;
private String journal;
private String number;
private String ee;
private String url;
public Article() {
}
public Article(String author, String title, String pages, Integer year, Integer volume, String journal, String number, String ee, String url) {
super();
this.author = author;
this.title = title;
this.pages = pages;
this.year = year;
this.volume = volume;
this.journal = journal;
this.number = number;
this.ee = ee;
this.url = url;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPages() {
return pages;
}
public void setPages(String pages) {
this.pages = pages;
}
public Integer getYear() {
return year;
}
public void setYear(Integer year) {
this.year = year;
}
public Integer getVolume() {
return volume;
}
public void setVolume(Integer volume) {
this.volume = volume;
}
public String getJournal() {
return journal;
}
public void setJournal(String journal) {
this.journal = journal;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getEe() {
return ee;
}
public void setEe(String ee) {
this.ee = ee;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
数据库帮助类:
package sax;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
//数据库工具类
public class DbHelper{
private static final String URL = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=dblp_Info";//
private static final String USER = "ssh";
private static final String PASSWORD = "123456";
private static Connection conn = null;
private static Statement stmt = null;
private static DbHelper helper = null;
static {
try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}catch (Exception e) {
e.printStackTrace();
}
}
private DbHelper() throws Exception{
conn = DriverManager.getConnection(URL,USER,PASSWORD);
stmt = conn.createStatement();
}
public static DbHelper getDbHelper() throws Exception{
if(helper == null || conn == null || conn.isClosed()){
helper = new DbHelper();
}
return helper;
}
public ResultSet executeQuery(String sql) throws Exception {
if (stmt != null) {
return stmt.executeQuery(sql);
}
throw new Exception("数据库未正常连接");
}
public ResultSet executeQuery(String sql, Object...args) throws Exception {
if (conn == null || conn.isClosed()) {
DbHelper.close();
throw new Exception("数据库未正常连接");
}
PreparedStatement ps = conn.prepareStatement(sql);
int index = 1;
for (Object arg : args) {
ps.setObject(index, arg);
index++;
}
return ps.executeQuery();
}
public int executeUpdate(String sql) throws Exception {
if (stmt != null) {
return stmt.executeUpdate(sql);
}
throw new Exception("数据库未正常连接");
}
public int executeUpdate(String sql, Object...args) throws Exception {
if (conn == null || conn.isClosed()) {
DbHelper.close();
throw new Exception("数据库未正常连接");
}
PreparedStatement ps = conn.prepareStatement(sql);
int index = 1;
for (Object arg : args) {
ps.setObject(index, arg);
index++;
}
return ps.executeUpdate();
}
public PreparedStatement prepareStatement(String sql) throws Exception {
return conn.prepareStatement(sql);
}
/**
* 关闭对象,同时将关闭连接
*/
public static void close() {
try {
if (stmt != null)
stmt.close();
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
helper = null;
}
}
}
自定义MyHandler:
package sax;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MyHandler extends DefaultHandler {
private List<Article> dblp = new ArrayList<>(); // 信息列表
private Article article = null;
private int propertyOrder = 0; // 1-author, 2-title, 3-pages, 4-year,5-volume,6-journal,7-number,8-ee,9-url
@Override
public void startDocument() throws SAXException {
System.out.println("解析文档开始");
}
@Override
public void endDocument() throws SAXException {
System.out.println("解析文档结束");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equals("article")) { //新的article开始
article = new Article();
return;
}
switch (qName) {
case "author":
propertyOrder = 1;
break;
case "title":
propertyOrder = 2;
break;
case "pages":
propertyOrder = 3;
break;
case "year":
propertyOrder = 4;
break;
case "volume":
propertyOrder = 5;
break;
case "journal":
propertyOrder = 6;
break;
case "number":
propertyOrder = 7;
break;
case "ee":
propertyOrder = 8;
break;
case "url":
propertyOrder = 9;
break;
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equals("article")) { //article结束
dblp.add(article);
article = null;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String content = new String(ch, start, length);
switch (propertyOrder) {
case 1:
article.setAuthor(content);
break;
case 2:
article.setTitle(content);
break;
case 3:
article.setPages(content);
break;
case 4:
int year = Integer.parseInt(content);
article.setYear(year);
break;
case 5:
int volume = Integer.parseInt(content);
article.setVolume(volume);
break;
case 6:
article.setJournal(content);
break;
case 7:
article.setNumber(content);
break;
case 8:
article.setEe(content);
break;
case 9:
article.setUrl(content);
break;
}
}
List<Article> getDblp() {
return dblp;
}
public void setDblp(List<Article> dblp) {
this.dblp = dblp;
}
public Article getArticle() {
return article;
}
public void setArticle(Article article) {
this.article = article;
}
}
测试类:
package sax;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXParserDemo {
public static void main(String[] args) throws SQLException {
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();//实例化SAXParserFactory对象
MyHandler handler = new MyHandler(); // 使用自定义的handle
parser.parse("dblp/dblp.xml", handler);
try {
// 连接数据库
DbHelper dbhelper = DbHelper.getDbHelper();
// 查询数据库
String sql = "insert into te(author, title, pages, year, volume, journal, number, ee, url)values(?, ?, ?, ?, ?, ?, ?, ?, ?)";
List<Article> dblp = handler.getDblp();
for (int i = 0; i < dblp.size(); i++) {
Article article = dblp.get(i);
dbhelper.executeUpdate(sql, article.getAuthor(), article.getTitle(), article.getPages(),
article.getYear(), article.getVolume(), article.getJournal(), article.getNumber(),
article.getEe(), article.getUrl());
}
dbhelper.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("done");
} catch (ParserConfigurationException | SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}