SAX相对DOM而言具有占用内存小的优势。并且SAX可以在不清楚XML结构的时候对XML进行遍历。 SAX共分为5个阶段,对应了5个方法:startDocument,endDocument,startElement,endElement,characters,分别为开始遍历文件,结束遍历文件,开始遍历标签,结束遍历标签以及遍历标签内容。 实现时需要继承Handler类并重写上面5个方法。 Main方法代码
import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; public class SaxRead { public static int cnt = 1; public static void main(String[] args) { //获取SAXParserFactory实例。 SAXParserFactory spf = SAXParserFactory.newInstance(); try { //通过factory获取SaxParser实例。 SAXParser parser = spf.newSAXParser(); //需要一个handler对象。 SaxParserHandler handler = new SaxParserHandler(); parser.parse("books.xml", handler); }catch (IOException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } } }SaxParserHandler类的代码: import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SaxParserHandler extends DefaultHandler { //遍历开始标签。 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); //qname为标签名称。 if( qName.equals("book") ) { System.out.println("This is " +(SaxRead.cnt)+ " book!"); //知道属性名称。 //System.out.println("book的属性为: "+attributes.getValue("id")); //不知道属性名称和个数。 for( int i=0;i<attributes.getLength();i++ ) { System.out.println("属性名:"+attributes.getQName(i)+" 属性值:"+attributes.getValue(i)); } } else if( !qName.equals("bookstore") ){ System.out.print("节点名是:"+qName); } } //遍历标签中的text内容。 @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); String text = new String(ch,start,length); //trim为去掉字符串中的空格。 if( !text.trim().equals("") ) { System.out.println(" 节点值是: "+text); } } //遍历结束标签。 @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); if( qName.equals("book") ) { System.out.println("**********The " +(SaxRead.cnt++)+ " book is over!*************"); } } //用来标志解析开始。 @Override public void startDocument() throws SAXException { super.startDocument(); System.out.println("SAX解析开始"); } //用来标志解析结束。 @Override public void endDocument() throws SAXException { super.endDocument(); System.out.println("SAX解析结束"); } }