SAX解析XML文档
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>