SAX方式解析XML文档
一、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、解析结果