一、使用SAX解析xml;xml数据导入数据库
Sax解析好处在于,事件处理机制,可随意处理需要的元素
1、新建一个myhandler类,继承DefaultHandler类 (必需要有)
并实现 文本处理事件:characters(),文档结束事件 :endDocument(),文档开始事件:startDocument;
元素开始事件:startElement(); 元素结束事件:endElement();
使用变量:
List<Article> dblp=new ArrayList<Article>(); 将每一个article对象,放到list集合中,最后返回
int flag=0; //用来使文本数据和元素对应
Article article=new Article();
2、在元素开始事件中
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if("article".equals(qName)){ //若是article元素,选择不处理,返回,new一个article对象,
article=new Article();
return;
}
switch(qName){
case "author":
if(flag==0){
flag=11;
}
else if(flag==11){
flag=22;
}
else if(flag==22){
flag=33;
}
if(flag==9){ //article最后一个自节点设置flag,此时已经访问到下一个article中的第一个author了
flag=11;
}
break;
case "title":
flag=2;
break;
case "pages":
flag=3;
break;
case "year":
flag=4;
break;
case "volume":
flag=5;
break;
case "journal":
flag=6;
break;
case "number":
flag=7;
break;
case "ee":
flag=8;
break;
case "url":
flag=9;
break;
}
}
3、文本处理事件
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String content=new String(ch,start,length); //获取当前节点下的文本数据
System.out.println(content);
switch(flag){ //根据文本开始事件中设置的flag,可将文本数据与它元素对应。
case 11:
article.setAuthor1(content);
break;
case 22:
article.setAuthor2(content);
break;
case 33:
article.setAuthor3(content);
break;
case 2:
article.setTitle(content);
break;
case 3:
article.setPages(content);
break;
case 4:
article.setYear(content);
break;
case 5:
article.setVolume(content);
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;
}
}
4、元素结束事件
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if("article".equals(qName)){//如果这个元素结束标记是 article,则将article添加到集合中,表示当前article对象已经读完,准备进行下一个
dblp.add(article);
article=null; //将它设为null,重复利用
}
}
5、最后创建一个方法,用来返回解析的数据
public List<Article> getdblp(){//不要遗漏这个方法,用来返回解析的数据
return dblp;
}
6、创建一个类运行
public class SAXparse {
public static void main(String[] args) throws Exception {
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser saxparse=factory.newSAXParser();
MyHandler myhandler=new MyHandler(); //实例一个myhandler类
saxparse.parse("dblp/dblp.xml", myhandler);
String sql = "insert into dblp(author1,author2,author3, title, pages, year, volume, journal, number, ee, url)values(?, ?, ?, ?, ?, ?, ?, ?, ?,?,?)";
DbHelper db=DbHelper.getDbHelper();
List<Article>list= myhandler.getdblp(); //取回解析的数据
for(int i=0;i<list.size();i++){
Article article=list.get(i);
db.executeUpdate(sql,article.getAuthor1(),article.getAuthor2(),article.getAuthor3(),article.getTitle(),article.getPages(),article.getYear(),article.getVolume(),article.getJournal(),article.getNumber(),article.getEe(),article.getUrl());
}
db.close();
}
}
Myhandler完整代码:
package com.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;
import com.dom.Article;
public class MyHandler extends DefaultHandler {
List<Article> dblp=new ArrayList<Article>();
int flag=0;
Article article=new Article();
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String content=new String(ch,start,length);
System.out.println(content);
switch(flag){
case 11:
article.setAuthor1(content);
break;
case 22:
article.setAuthor2(content);
break;
case 33:
article.setAuthor3(content);
break;
case 2:
article.setTitle(content);
break;
case 3:
article.setPages(content);
break;
case 4:
article.setYear(content);
break;
case 5:
article.setVolume(content);
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;
}
}
@Override
public void endDocument() throws SAXException {
System.out.println("文档结束");
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if("article".equals(qName)){//如果这个元素结束标记是 article,则将article添加到集合中,表示当前article对象已经读完,准备进行下一个
dblp.add(article);
article=null; //将它设为null,重复利用
}
}
public List<Article> getdblp(){//不要遗漏这个方法,用来返回解析的数据
return dblp;
}
@Override
public void startDocument() throws SAXException {
System.out.println("文档开始");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if("article".equals(qName)){
article=new Article();
return;
}
switch(qName){
case "author":
if(flag==0){
flag=11;
}
else if(flag==11){
flag=22;
}
else if(flag==22){
flag=33;
}
if(flag==9){ //article最后一个自节点设置flag,此时已经访问到下一个article中的第一个author了
flag=11;
}
break;
case "title":
flag=2;
break;
case "pages":
flag=3;
break;
case "year":
flag=4;
break;
case "volume":
flag=5;
break;
case "journal":
flag=6;
break;
case "number":
flag=7;
break;
case "ee":
flag=8;
break;
case "url":
flag=9;
break;
}
}
}