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、解析结果

猜你喜欢

转载自www.cnblogs.com/hdl-blog/p/11994176.html