1、SAX按照xml文件的顺序来逐步解析。DOM处理方式需要将整个xml读入,然后在内存中创建DOM树,生成DOM树上的每个Node对象;SAX方式不同于DOM的文档驱动,它是事件驱动,它不需要读入整个文档,文档的读入过程即是SAX的解析过程。事件驱动是一种基于回调机制的程序运行方法。
2、优缺点:
SAX优点:
->采用事件驱动模式,对内存消耗比较小
->适用于只需要处理xml中数据时
SAX缺点:
->不易编码
->很难同时访问同一个xml中的多处不同数据
3、SAX解析过程及源码
//获取SAXParserFactory实例
SAXParserFactory spf = SAXParserFactory.newInstance();
//通过SAXParserFactory实例返回一个SAXParser实例
try {
SAXParser parser = spf.newSAXParser();
//创建SAXParserHandler
SAXParserHander handler = new SAXParserHander();
parser.parse(“xmlPractise/books.xml”, handler);
System.out.println(“~!~!~!共有” + handler.getBookList().size() + “本书”);
for(Book book : handler.getBookList()){
System.out.println(book.getId());
System.out.println(book.getName());
System.out.println(book.getAuthor());
System.out.println(book.getYear());
System.out.println(book.getPrice());
System.out.println(book.getLanguage());
System.out.println(“==========finish========”);
}
} catch (ParserConfigurationException | SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
3.1 上述代码中handler的实现代码
public class SAXParserHander extends DefaultHandler {
String value = null;
Book book = null;
private ArrayList<Book> bookList = new ArrayList<Book>();
int bookIndex = 0;
/**
* 用来遍历xml文件的开始标签
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//调用DefaultHandler类的startElement方法
super.startElement(uri, localName, qName, attributes);
//开始解析book元素的属性
if(qName.equals("book")){
//创建一个book对象
book = new Book();
bookIndex ++;
System.out.println("===================下面开始遍历第" + bookIndex +"本书的内容开始=================");
//已知book元素下属性的名称,根据属性名称获取属性值
/*String value = attributes.getValue("id");
System.out.println("book的属性值是:" + value);*/
//不知道book元素下属性的名称及个数,如果获取属性名及属性值
int num = attributes.getLength();
for(int i = 0; i < num; i ++){
System.out.print("book元素的第" + (i + 1) + "个属性名是:" +attributes.getQName(i));
System.out.println("---属性值是:" + attributes.getValue(i));
if(attributes.getQName(i).equals("id")){
book.setId(attributes.getValue(i));
}
}
}else if(!qName.equals("book") && !qName.equals("bookstore")){
System.out.print("节点名是:" + qName);
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
value = new String(ch, start, length);
if(!value.trim().equals("")){
System.out.println("--节点值是:" + value);
}
}
/**
* 用来遍历xml文件的结束标签
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
//调用DefaultHandler类的endElement方法
super.endElement(uri, localName, qName);
//判断是否针对一本书已经遍历结束
if(qName.equals("book")){
this.bookList.add(book);
book = null;
System.out.println("===================下面开始遍历第" + bookIndex +"本书的内容结束=================");
}else if(qName.equals("name")){
this.book.setName(value);
}else if(qName.equals("author")){
this.book.setAuthor(value);
}else if(qName.equals("year")){
this.book.setYear(value);
}else if(qName.equals("price")){
this.book.setPrice(value);
}else if(qName.equals("language")){
this.book.setLanguage(value);
}
}
/**
* 用来标识解析开始
*/
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("SAX解析开始");
}
/**
* 用来标识解析结束
*/
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("SAX解析结束");
}
/**
* @return the bookList
*/
public ArrayList<Book> getBookList() {
return bookList;
}
/**
* @param bookList the bookList to set
*/
public void setBookList(ArrayList<Book> bookList) {
this.bookList = bookList;
}
}