Xml解析之SAX解析

一、使用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;	
		}
		
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值