SAX解析XML文档

来源:互联网 发布:kali linux双系统安装 编辑:程序博客网 时间:2024/05/19 08:40
1.在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。
此种情况下,如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。
2.SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。
3.SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器

4.SAX方式解析XML文档

1)使用SAXParserFactory创建SAX解析工厂
SAXParserFactory spf = SAXParserFactory.newInstance();
2)通过SAX解析工厂得到解析器对象        
SAXParser sp = spf.newSAXParser();
3)通过解析器对象得到一个XML的读取器
XMLReader xmlReader = sp.getXMLReader();
4)设置读取器的事件处理器        
xmlReader.setContentHandler(new BookParserHandler());
5)解析xml文件    
xmlReader.parse("book.xml");

eg:

<?xml version="1.0" encoding="UTF-8"?><书架>   <书>     <书名 name="aaa">java</书名>      <作者>小明</作者>      <售价>39元</售价>   </书>    <书>     <书名>JavaWeb</书名>      <作者>zhangsan</作者>      <售价>89元</售价>   </书> </书架>
package cn.lsl.sax;import java.io.IOException;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;import org.xml.sax.helpers.DefaultHandler;public class Demo {public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {//1.创建生产解析器的工厂SAXParserFactory factory = SAXParserFactory.newInstance();//2.创建解析器SAXParser parser = factory.newSAXParser();//3.得到xml文档读写器XMLReader reader = parser.getXMLReader();//4.为读写器设置内容处理器reader.setContentHandler(new BookNameHandler());//利用读写器解析xml文档reader.parse("src/book.xml");}}//获取整个xml文档内容的处理器class ListHandler extends DefaultHandler{@Overridepublic void startElement(String uri, String localName, String name,Attributes attributes) throws SAXException {System.out.println("<"+name+">");}@Overridepublic void endElement(String uri, String localName, String name)throws SAXException {System.out.println("</"+name+">");}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {System.out.println(new String(ch,start,length));}}//获取书名和属性class BookNameHandler extends DefaultHandler{private String currentTag;private int count;    //记住当前解析到了几个书名书签, 用来控制等下要获得第几本书的书名@Overridepublic void startElement(String uri, String localName, String name,Attributes attributes) throws SAXException {currentTag = name;if("书名".equals(currentTag)){count++;}//得到标签所有属性for(int i=0;attributes!=null && i<attributes.getLength(); i++){String attName = attributes.getQName(i);String attValue = attributes.getValue(i);System.out.println(attName + "=" + attValue);}}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {if("书名".equals(currentTag)&&count==1){System.out.println(new String(ch,start,length));}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {// TODO Auto-generated method stubsuper.endElement(uri, localName, qName);}}
5.读取xml文档内容,并封装到Bean中

package cn.lsl.sax;import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;import org.xml.sax.helpers.DefaultHandler;import cn.lsl.domain.Book;public class Demo1 {public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser parser = factory.newSAXParser();XMLReader reader = parser.getXMLReader();BeanListHandler handler = new BeanListHandler();reader.setContentHandler(handler);reader.parse("src/book.xml");System.out.println(handler.getBooks().size());}}class BeanListHandler extends DefaultHandler{private List list = new ArrayList();private Book book;private String currentTag;public List getBooks(){return list;}@Overridepublic void startElement(String uri, String localName, String name,Attributes attributes) throws SAXException {currentTag = name;if(name.equals("书")){book = new Book();}}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {if(currentTag!=null && currentTag.equals("书名")){book.setBookname(new String(ch,start,length));}if(currentTag!=null && currentTag.equals("作者")){book.setBookname(new String(ch,start,length));}if(currentTag!=null && currentTag.equals("售价")){book.setBookname(new String(ch,start,length));}}@Overridepublic void endElement(String uri, String localName, String name)throws SAXException {if(name.equals("书")){list.add(book);}currentTag = null;}}