XML解析–SAX
- Simple API for XML
- 流模型中的推模型(Push)
- 采用事件/流模型来解析XML文档,更快速、更轻量。
- 有选择的解析和访问,不像DOM加载整个文档,内存要求较低
- SAX对XML文档的解析为一次性读取,不创建/不存储文档对象,很难同时访问文档中的多处数据。
- 推模型。当它每发现一个节点就引发一个事件,而我们需要编写这些事件的处理程序。关键类:DefaultHandler
SAX的五个回调方法:
- startDocument 文档开始解析;
- endDocument 文档结束解析
- startElement 开始访问元素
- endElement 结束访问元素
- characters 访问元素正文。
SAX–代码实例:
SAXReader .java
package com.torey.javaAdvanced.mooc4.sax;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName:SAXReader
* @Description:
* @author: Torey
*/
public class SAXReader {
public static void main(String[] args) throws SAXException, IOException {
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
BookHandler bookHandler = new BookHandler();
xmlReader.setContentHandler(bookHandler);
xmlReader.parse("books.xml");
System.out.println(bookHandler.getNameList());
}
}
class BookHandler extends DefaultHandler{
private List<String> nameList;
private Boolean title=false;
public List<String> getNameList(){
return nameList;
}
//xml文档加载时
@Override
public void startDocument ()throws SAXException
{
System.out.println("Start parsing document...");
nameList=new ArrayList<>();
}
//文档解析结束
@Override
public void endDocument ()throws SAXException
{
System.out.println("End");
}
//访问某一个元素
@Override
public void startElement (String uri, String localName,
String qName, Attributes attributes)
throws SAXException
{
if (qName.equals("title")) {
title=true;
}
}
//结束访问元素
@Override
public void endElement (String uri, String localName, String qName)
throws SAXException
{
if (title) {
title=false;
}
}
//访问元素正文
@Override
public void characters (char ch[], int start, int length)
throws SAXException
{
if (title) {
String bookTitle= new String(ch,start,length);
System.out.println("Book title:" + bookTitle);
nameList.add(bookTitle);
}
}
}
books.xml
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
<book category="JS">
<title lang="en">java script从入门到放弃</title>
<author>torey</author>
<year>2018</year>
<price>39.95</price>
</book>
</bookstore>
运行结果如下: