SAX采用事件处理器的方式解析XML文档,利用SAX解析XML文档,涉及两个部分:解析器和事件处理器
解析器可以使用JAXP的API进行创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档
解析器在采用SAX方式解析某个XML文档时,它只要解析到XML文档的一个组成部分,都回去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前XML文件内容作为方法的参数传递给事件处理器
事件处理器有程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到SAX解析器得到的数据,从而可以决定如何对数据进行处理
通过一个实例体验一下,本实例通过读取一个book.xml文档,将book中内容封装到一个Book对象中,并将多个Book对象放入LIst中返回,实例代码如下:
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentMap;
import javax.sql.rowset.spi.XmlReader;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class SAXParesXML {
/**
* sax parse
* @throws SAXException
* @throws ParserConfigurationException
* @throws IOException
*/
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
// 创建解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 得到解析器
SAXParser sp = factory.newSAXParser();
// 得到读取器
XMLReader reader = sp.getXMLReader();
//设置内容处理器
BeanListHandler beanListHandler = new BeanListHandler();
reader.setContentHandler(beanListHandler);
//读取xml文档内容
reader.parse("src/book.xml");
List<Book> books = beanListHandler.getBooks();
//遍历输出
//...
}
}
// 把xml的每一本书封装到Book对象中,并把多个Book对象封装到List中返回
class BeanListHandler extends DefaultHandler {
private List books = new ArrayList();
private String currentTag;
private Book book;
public List getBooks() {
return books;
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if ("book".equals(currentTag)) {
book = new Book();
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if ("name".equals(currentTag)) {
book.setName(new String(ch, start, length));
}
if ("author".equals(currentTag)) {
book.setAuthor(new String(ch, start, length));
}
if ("price".equals(currentTag)) {
book.setPrice(new String(ch, start, length));
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (qName.equals("book")) {
books.add(book);
book = null;
}
currentTag = null;
}
}
Book类代码如下:
public class Book {
private String name;
private String author;
private String price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
book.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book>
<name>C++ l</name>
<author>Lippman</author>
<title>cpp</title>
</book>
<book>
<name>C++ h</name>
<author>houjie</author>
<title>stl</title>
</book>
</bookstore>