SAX解析XML文件

来源:互联网 发布:淘宝背景图片素材 编辑:程序博客网 时间:2024/06/14 13:13

在java中,原生解析xml文档的方式有两种,分别是:Dom解析和Sax解析

Sax解析是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档

Sax采用事件驱动的方式解析文档。

在Sax的解析过程中,读取到文档开头、结尾,元素的开头和元素的结尾都会触发一些回调方法,你可以在这些回调方法中进行相应事件处理这四个方法是:startDocument() 、 endDocument()、 startElement()、 endElement此外,光读取到节点处是不够的,我们还需要characters()方法来仔细处理元素内包含的内容将这些回调方法集合起来,便形成了一个类,这个类也就是我们需要的触发器SaxHandler

更详细的介绍可查看API文档—-> defaultHandler

代码如下:

package com.vgbh;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 SaxXMLDemo {    public static void main(String[] args) {        SaxXMLDemo sxd = new SaxXMLDemo();        String uri = "bookstore.xml";        try {            sxd.querySaxXMLDemo (uri);        } catch (Exception e) {            e.printStackTrace();        }    }    //读取XML文件    private void querySaxXMLDemo(String uri) throws Exception {        /*         * 该方法主要依赖于SaxHandler类的方法重写         */        //实例化SAXparseFactory对象        SAXParserFactory spFactory = SAXParserFactory.newInstance();        //创建解析器        SAXParser sParser = spFactory.newSAXParser();        //获取需要解析的文档,生成解析器,最后解析文档        SaxHandler sh = new SaxHandler();        sParser.parse(uri, sh);    }}class SaxHandler extends DefaultHandler {    //character代表传回来的字符数组,内容包含元素。start数组开始的位置。end数组结束的位置。    public void characters (char[] character, int start, int end) throws SAXException {        String content = new String(character, start, end);        System.out.println(content);        super.characters(character, start, end);    }    public void startDocument () throws SAXException {        System.out.println("开始解析文档...");        super.startDocument();    }    public void endDoucement () throws SAXException{        System.out.println("结束解析文档...");        super.endDocument();    }    //uri是名称空间URI    localNmae是本地名称         qName是限定名称         attribute很明显是属性的集合    以上的四种变量若不可用,则为空。    public void startElement (String uri, String localName, String qName, Attributes attribute) throws SAXException {        //System.out.print("开始解析元素...");        if (attribute != null) {            for (int i = 0; i < attribute.getLength(); i ++) {                //getQName()是获取属性名称                System.out.print(attribute.getQName(i) + "=\"" + attribute.getValue(i) + "\"");            }        }        System.out.print(qName + ":");        super.startElement(uri, localName, qName, attribute);    }    //uri是名称空间URI    arg1是本地名称         qName是限定名称            以上的三种变量若不可用,则为空    public void endElement (String uri, String localNmae, String qName) throws SAXException {        //System.out.print(qName);        //System.out.print("结束解析元素...");        super.endElement(uri, localNmae, qName);    }}

SAX解析XML文件主要依靠的是对SaxHandler类的方法重写,所以理解原生类的函数很重要。
SaxHandler类在线API:
http://docs.basex.org/javadoc/org/basex/build/xml/SAXHandler.html

有问题可以联系我的邮箱。

原创粉丝点击