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>