为了账号安全,请及时绑定邮箱和手机立即绑定

Java 解析xml 之 SAX解析

SAX是什么
SAX是一种快速读写XML数据的方式。
局限

1.SAX分析器在解析xml文档时,触发了一系列事件,因为事件本身是有时序性的。因此SAX一旦经过了某个元素,没有办法返回再去访问。

2.SAX分析器只事检查xml文档中的字节流,语法,然后触发相应事件。而处理函数本身则要由程序实现,相比DOM,SAX缺乏灵活性。

优势

SAX分析器实现简单,对内存要求比较低,因此实现小路比较高;对于大型的xml文档来说,通常会用SAX而不用DOM;对于那些只需要访问xml文档中的数据而不对文档进行更改的应用程序来说,SAX分析器更为合适。

SAX实例解析
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>

    <book category="man">
        <title lang="en">Juny Of City</title>
        <author>Juny</author>
        <year>2011</year>
        <price>15.99</price>
    </book>

    <book category="children">
          <title lang="en">Harry Potter</title> 
          <author>J K. Rowling</author> 
          <year>2005</year> 
          <price>29.99</price> 
    </book>
</bookstore>
解析过程
package sax;

import java.io.File;
import java.util.Stack;

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 SaxTest2 {
    public static void main(String[] args) throws Exception {
        // step 1: 获得SAX解析器工厂实例
        SAXParserFactory factory = SAXParserFactory.newInstance();

        // step 2: 获得SAX解析器的实例
        SAXParser parser = factory.newSAXParser();

        // step 3: 开始进行解析
        // 传入待解析的文档的处理器
        parser.parse(new File("books.xml"),new MySAXHandler());
    }
}

class MySAXHandler extends DefaultHandler {
    // 使用栈这个数据结构来保存
    private Stack<String> stack = new Stack<String>();

    // 数据
    private String title;
    private String author;
    private String year;
    private double price;

    @Override
    public void startDocument() throws SAXException {
        System.out.println("start document-> parse begin");
    }

    @Override
    public void endDocument() throws SAXException {
        System.out.println("end document-> parse finished");
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {

        // 将标签名压入栈
        stack.push(qName);

        // 处理属性
        for (int i = 0; i < attributes.getLength(); i++) {
            String attrName = attributes.getQName(i);
            String attrValue = attributes.getValue(i);

            System.out.println("属性:" + attrName + ":" + attrValue);

        }

    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {

        // 取出标签名
        String tag = stack.peek();

        if ("title".equals(tag)) {
            title = new String(ch, start, length);

        } else if ("author".equals(tag)) {
            author = new String(ch, start, length);
        } else if ("year".equals(tag)) {
            year = new String(ch, start, length);
        } else if ("price".equals(tag)) {
            price = Double.parseDouble(new String(ch, start, length));
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        stack.pop();//表示该元素解析完毕,需要从栈中弹出标签

        if("book".equals(qName)){
            System.out.println("Book info: -------");
            System.out.println("    title: " + title);
            System.out.println("    author: " + author);
            System.out.println("    year: " + year);
            System.out.println("    price: " + price);
            System.out.println();
        }
    }
}
## 控制台输出 ##
start document-> parse begin
属性:category:man
属性:lang:en
Book info: -------
    title: Juny Of City
    author: Juny
    year: 2011
    price: 15.99

属性:category:children
属性:lang:en
Book info: -------
    title: Harry Potter
    author: J K. Rowling
    year: 2005
    price: 29.99

end document-> parse finished
点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消