原理
SAX,全称Simple API for XML,是一种以事件驱动的XMl API,不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。顺序读取,不用一次装载整个文件,遇到标签会触发一个事件,适合对XML的顺序访问,占用内存资源稍小
优缺点
- 优点
解析速度快
占用内存少 - 缺点:
只能读取XML,无法修改XML
无法随机访问某个标签(节点)
解析过程
-
得到xml文件对应的资源,可以是xml的输入流,文件和uri
File file = new File("C:\\\\Users\\\\Administrator\\\\Desktop\\\\books.xml"); DefaultHandler defaultHandler = new SaxParserHandler();
其中,SaxParserHandler是继承的DefaultHandler抽象类,该类是SAX解析的核心所在,我们要重写以下几个我们关心的方法。
startDocument():文档解析开始时调用,该方法只会调用一次
startElement(String uri, String localName, String qName, Attributes attributes):标签(节点)解析开始时调用
uri:xml文档的命名空间
localName:标签的名字
qName:带命名空间的标签的名字
attributes:标签的属性集
characters(char[] ch, int start, int length):解析标签的内容的时候调用
ch:当前读取到的TextNode(文本节点)的字节数组
start:字节开始的位置,为0则读取全部
length:当前TextNode的长度
endElement(String uri, String localName, String qName):标签(节点)解析结束后调用
endDocument():文档解析结束后调用,该方法只会调用一次import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SaxParserHandler extends DefaultHandler { //文档开始 @Override public void startDocument() throws SAXException { super.startDocument(); System.out.println("解析开始"); } //文档结束 @Override public void endDocument() throws SAXException { super.endDocument(); System.out.println("解析结束"); } //遍历开始标签 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); System.out.print("<"+qName); for(int i=0;attributes!=null&&i<attributes.getLength();i++){ String attName=attributes.getQName(i); String attValueString=attributes.getValue(i); System.out.print(" "+attName+"="+attValueString); } System.out.print(">\n"); } //遍历结束标签 @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); System.out.print("</"+qName+">"); } //获取元素值 @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); //得到当前文本内容 String content = new String(ch,start,length); System.out.println(content); } }
-
得到SAX解析工厂(SAXParserFactory)
//2.创建解析工厂 SAXParserFactory factory= SAXParserFactory.newInstance();
-
由解析工厂生产一个SAX解析器(SAXParser)
//3.通过工厂获取SaxParser实例,得到解析器 SAXParser sp=factory.newSAXParser();
-
传入输入流和handler给解析器,调用parse()解析
//2,3,4步可以合成一步, sp.parse(file,defaultHandler); //3.得到解读器 // XMLReader reader=sp.getXMLReader(); //4.设置内容处理器 // reader.setContentHandler(defaultHandler); //5.读取xml的文档内容 // reader.parse("C:\\Users\\Administrator\\Desktop\\books.xml");