由于dom采用的是将xml文档加载入内存进行处理的方式,如果xml文档较大,则会导致加载时间过长,效率降低的情况,因此,sun公司在JAXP中又添加了对SAX的支持;
SAX,全称Simple API for XML,既是一种接口,也是一种软件包。它是一种XML解析的替代方法。SAX不同于DOM解析,它逐行扫描文档,一边扫描一边解析。由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。
SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分“解析器”和“事件处理器”:
- 解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。
- 解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
- 事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理.
public class SAX_xml { public static void main(String[] args) throws SAXException, ParserConfigurationException, IOException { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse(new File("src/package1112/books.xml"), new DefaultHandler(){}); }}
这段代码为一个主类,主类里面只有一个主函数。
主函数整体看见就三条语句:
第一句:声明一个工厂
第二句:声明一个解析器
第三句:解析xml文档(内含两个参数,第一个是要解析的xml文档,第二个是)
第三句展开
第一个函数:
public void startDocument() throws SAXException{ System.out.println("文档开始读取……");}
第二个函数:(输出起始标签,该标签的键值对(属性名:属性值))
public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException{ System.out.println("<"+qName+">"); for(int i=0;i
第三个函数:(输出节点的文本内容)
public void characters(char[] ch,int start,int length) throws SAXException{ System.out.println(new String(ch,start,length));}
第四个函数:(输出结束标签)
public void endElement(String uri,String localName,String qName) throws SAXException{ System.out.println("<"+qName+">");}
第五个函数:(解析结束)
public void endDocument() throws SAXException{ System.out.println("文档结束了");}
完整代码:
package com.sy;
import java.io.File;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class SAX_xml { public static void main(String[] args) throws Exception, SAXException { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse(new File("books.xml"), new DefaultHandler(){ @Override public void startDocument() throws SAXException { System.out.println("文档开始读取了……"); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("<"+qName+">"); for(int i=0;i<attributes.getLength();i++){ System.out.println(attributes.getQName(i) + ":" + attributes.getValue(i)); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { System.out.println(new String(ch, start, length)); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("<"+qName+">"); } @Override public void endDocument() throws SAXException { System.out.println("文档结束了……"); } }); }}
补充:
- 快捷键完成五个重载函数:alt+/ 输入要是用的函数的函数名的前两个字母(函数体需要重写)
- 给方法加注释:shift+alt+/
- 给类加注释:shift+alt+j
- 部分代码封装为函数:ctrl+alt+m
- 查看类的子类(继承关系):选中类名,Ctrl+t
- 查看类所在包:点击类名,相应导包语句背景色改变
- main函数生成快捷键:main alt+/
- 导包:ctrl+shift
- builder编译
- has_是否拥有
- 加载本地目录(清空列表):dshift选中所有项目,右键,delete
- map