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文档

<?xml version="1.0" encoding="UTF-8"?> <!-- 第一句为固定的声明语句 -->
<person> <!--开始标签,可任意定义,但要有对应的结束标签--><!-- person也是根节点 -->
    <p1> <!-- person的一个子节点 -->
        <name address="beijing">zhangsan</name>
        <age>20</age>
    </p1>
    <p1>
        <name>wangwu</name>
        <age>29</age>
    </p1>
</person> <!--结束标签,与开始标签对应-->

2、SAX方式解析XML文档的Java代码
package com.hdl.Saxparser;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
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 MySAXParserTest {

public static void main(String[] args) {
    try {
        // 1、创建SAX解析器工厂
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        // 2、创建SAX解析器
        SAXParser saxParser = saxParserFactory.newSAXParser();
        // 3、执行parser方法
        saxParser.parse("conf/persons.xml", new MyHandler());
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

class MyHandler extends DefaultHandler{

/* (non-Javadoc)
 * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
 */
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    super.startElement(uri, localName, qName, attributes);
    System.out.print("<" + qName + ">");
}

/* (non-Javadoc)
 * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
 */
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
    super.characters(ch, start, length);
    System.out.print(new String(ch, start, length));
}

/* (non-Javadoc)
 * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
 */
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
    super.endElement(uri, localName, qName);
    System.out.print("<" + qName + ">");
}

}
   3、解析结果
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值