一、SAX (Simple API for XML)
SAX解析方式是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
优点: 无需将整个文档加载到内存中, 所以内存消耗少的 ,适合解析特别大的 XML文件。
二、步骤
- 创建解析工厂:通过 SAXParaserFactory.newInstance()方法获取
- 创建解析器:通过newSAXParser()获取
- 执行 parser 方法,传入两个参数:XML文件路径、事件处理器
- 创建一个类,继承 DefaultHander 类 ,重写三个方法 :
- startElement(String uri, String localName, String qName, Attributes attributes):获取开始标签
- qName :把 开始 标签名称返回
- attributes :返回标签中的属性对象
- characters(char[] ch, int start, int length):获取标签文本内容
- endElement(String uri, String localName, String qName):获取结束标签
三、实现代码
1、XML文档
1 <?xml version="1.0" encoding="UTF-8"?> <!-- 第一句为固定的声明语句 -->
2 <person> <!--开始标签,可任意定义,但要有对应的结束标签--><!-- person也是根节点 -->
3 <p1> <!-- person的一个子节点 -->
4 <name address="beijing">zhangsan</name>
5 <age>20</age>
6 </p1>
7 <p1>
8 <name>wangwu</name>
9 <age>29</age>
10 </p1>
11 </person> <!--结束标签,与开始标签对应-->
2、SAX方式解析XML文档的Java代码
1 package com.hdl.Saxparser;
2
3 import java.io.IOException;
4
5 import javax.xml.parsers.ParserConfigurationException;
6 import javax.xml.parsers.SAXParser;
7 import javax.xml.parsers.SAXParserFactory;
8
9 import org.xml.sax.Attributes;
10 import org.xml.sax.SAXException;
11 import org.xml.sax.helpers.DefaultHandler;
12
13 public class MySAXParserTest {
14
15 public static void main(String[] args) {
16 try {
17 // 1、创建SAX解析器工厂
18 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
19 // 2、创建SAX解析器
20 SAXParser saxParser = saxParserFactory.newSAXParser();
21 // 3、执行parser方法
22 saxParser.parse("conf/persons.xml", new MyHandler());
23 } catch (ParserConfigurationException e) {
24 e.printStackTrace();
25 } catch (SAXException e) {
26 e.printStackTrace();
27 } catch (IOException e) {
28 e.printStackTrace();
29 }
30 }
31 }
32
33 class MyHandler extends DefaultHandler{
34
35 /* (non-Javadoc)
36 * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
37 */
38 @Override
39 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
40 super.startElement(uri, localName, qName, attributes);
41 System.out.print("<" + qName + ">");
42 }
43
44 /* (non-Javadoc)
45 * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
46 */
47 @Override
48 public void characters(char[] ch, int start, int length) throws SAXException {
49 super.characters(ch, start, length);
50 System.out.print(new String(ch, start, length));
51 }
52
53 /* (non-Javadoc)
54 * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
55 */
56 @Override
57 public void endElement(String uri, String localName, String qName) throws SAXException {
58 super.endElement(uri, localName, qName);
59 System.out.print("<" + qName + ">");
60 }
61 }
3、解析结果