2017/4/25-SAX解析XML文件

SAX解析XML

  1、分析

    SAX是按照XML文件的顺序执行,可以说是边扫描,边解析。所以无须将整个文件加载至内存中。

  

  2、优点

    1)占用内存少。

    2)解析效率高。

  

  3、缺点

    1)只能进行读取。

    2)无法修改xml中节点数据。

    3)无法知道正在遍历的节点的上一节点的名称,并且无法任意访问某一节点。

  

  4、使用场合

    1)大型XML文件,并且只需要一次性读取xml文件的内容。

  

  5、讲解

    1)自定义解析类需继承DefaultHandler( org.xml.sax.helpers.DefaultHandler)。

    2)重写父类中的多个方法即可。

      a)startDocument() : 该方法是开始解析xml的方法。

      b)startElement() : 该方法是解析某个标签(<name>),获取当前标签名称及属性。

      c)characters() : 在解析到某个标签时,获取标签内容值的时候调用。

      d)endElement() : 该方法为某个标签(</name>)解析完后调用。

      e)endDocument() : 该方法为整个xml文件解析完时调用。

 

  6、详解

    1)XML文件示例

<?xml version="1.0" encoding="utf-8"?>

<books>
  <book>
    <id>10001</id>
    <name>JAVA BOOK</name>
    <author>James Gosling</author>
    <publishDate>2017-04-24</publishDate>
  </book>
  <book>
    <id>10002</id>
    <name>C BOOK</name>
    <author>Dennis Ritchie</author>
    <publishDate>2017-04-24</publishDate>
  </book>
</books>
View Code

    2)自定义SAXParserHandler类,继承DefaultHandler类,重写5个方法。

package com.mean.xml.sax.handler;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * SAX解析XML文件
 * @author zhangjk
 */
public class SAXParserHandler extends DefaultHandler {
    private boolean isUsefulElement;

    public SAXParserHandler() {
        isUsefulElement = false;
    }

    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        System.out.println("--------开始解析XML--------");
    }

    @Override
    public void startElement(String uri, String localName, String element, Attributes attributes) throws SAXException {
        if (element.equals("books")) {
            isUsefulElement = true;
        } else if (element.equals("book")) {
            System.out.println("--------开始解析本书--------");
            isUsefulElement = true;
        } else {
            System.out.println("element:" + element);
            isUsefulElement = false;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (!isUsefulElement) {
            String value = new String(ch, start, length).trim();
            if (!value.isEmpty()) {
                System.out.println("value:" + value);
            }
        }
    }

    @Override
    public void endElement(String uri, String localName, String element) throws SAXException {
        if (element.equals("book")) {
            System.out.println("--------书本解析完毕--------");
        }
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        System.out.println("--------XML解析完毕--------");
    }

    public static SAXParserHandler getInstance() {
        if (SAXParserHanderSingle.INSTANCE == null) {
            SAXParserHanderSingle.INSTANCE = new SAXParserHandler();
        }
        return SAXParserHanderSingle.INSTANCE;
    }

    private static class SAXParserHanderSingle {
        private static SAXParserHandler INSTANCE = new SAXParserHandler();
    }
}
View Code

  

  7、步骤

    1)首先获取SAXParserFactory(SAX解析工厂)对象。

    2)从SAXParserFactory对象中获取SAXParser(SAX解析)对象。

    3)创建自定义的SAXParserHandler类对象。

    4)调用步骤2中SAX解析对象的parse()方法,参数分别为XML文件的输入流,自定义的SAX解析类。    

        String path = Class.class.getResource("/").getPath() + "Book.xml";
        try {
            SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
            SAXParser saxParser = saxParserFactory.newSAXParser();
            SAXParserHandler sax = SAXParserHandler.getInstance();
            saxParser.parse(new FileInputStream(new File(path)), sax);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
View Code

 

  注:本文部分参考引用

  1、http://blog.csdn.net/ydxlt/article/details/50183693

posted @ 2017-04-25 09:54  花生来三两  阅读(270)  评论(0)    收藏  举报