SAX解析
1.事件处理 例子:
事件元素:
1.文档开始 <books>
2.元素开始 <book>
3.元素对象属性 ----------》 <title>bookname</title>
4.元素结束 <book>
5.文档结束 <books>
事件创建
创建事件对象继承于org.xml.sax.helpers.DefaultHandler类,重写
startDocument() <1.文档开始>
endDocument() <5.文档结束>
startElement() <2.元素开始>
endElement() <4.元素结束>
characters() <5.元素对象属性>
方法实现对事件中的元素的处理。
sax解析对象
一、SAX解析对象的创建
SAX解析对象是由SAX对象工厂所创建出来的,要创建一个sax解析对象,有如下过程:
1.创建sax对象工厂
2.从工厂中提出sax解析对象
代码:
SAXParserFactory sFactory=SAXParserFactory.newInstance();//获得一个解析工厂
SAXParser sParser=sFactory.newSAXParser();//获得一个sax解析对象
二、SAX对象的方法
调用sax对象的parse方法,传入文件参数及事件处理对象实现xml解析。
代码:
DefaultHandler hander=new SaxHander(); //事件对象
InputStream input=new FileInputStream(“books.xml”);//
//然后用解析对象的parse方法把文件和时间处理对象联系起来
sParser.parse(input, hander);
至此解析完毕
下面给出例子:
books.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book bookno="001">
<title>数据挖掘</title>
<author>王一</author>
<price>45</price>
</book>
<book bookno="002">
<title>密码学</title>
<author>王二</author>
<price>50</price>
</book>
</books>
创建SaxHander事件处理类
SaxHander.java
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 book.Book;
public class SaxHander extends DefaultHandler {
private String tag; //记录当前处理的标签元素
private Book book;
private List<Book> list;
//返回解析完毕的列表
public List<Book> getList(){
return list;
}
//文档开始解析
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
list=new ArrayList<Book>();
}
//文档结束解析
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}
//开始元素解析
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
if(qName.equals("book")){
book=new Book();
String bookNo=attributes.getValue("bookno");
book.setBookNo(bookNo);
}
tag=qName;
}
//元素结束解析
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
if(qName.equals("book")){
list.add(book);
book=null;
}
tag=null;
}
//对元素中嵌入的元素解析
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
if(tag!=null){
String str=new String(ch,start,length).trim();//获得嵌入元素的值
if(tag.equals("title")){
book.setTitle(str);
}
if(tag.equals("author")){
book.setAuthor(str);
}
if(tag.equals("price")){
book.setPrice(Double.parseDouble(str));
}
}
}
}
创建解析类 SaxParse.java
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
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 book.Book;
import book.parseXml;
public class SaxParse {
public List<Book> xmlParse(String fileName) {
List<Book> list=new ArrayList<Book>();
SAXParserFactory sFactory=SAXParserFactory.newInstance();//获得一个解析工厂
SaxHander hander=new SaxHander(); //事件对象
try {
SAXParser sParser=sFactory.newSAXParser();// 获得一个解析对象
InputStream input=new FileInputStream(fileName);
//然后用解析对象的parse方法把文件和时间处理对象联系起来
sParser.parse(input, hander);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
list=hander.getList();
return list;
}
public static void main(String []args){
SaxParse sp= new SaxParse();
System.out.println("SAX解析结果:");
List<Book> list=sp.xmlParse("books.xml");
for(Book book:list){
System.out.println(book.toString());
}
}
}