欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SAX方式解析XML文件

程序员文章站 2022-06-16 12:07:44
...

SAX,全称Simple API for XML,是一种以事件驱动的 XML API,SAX 与 DOM 不同的是它边扫描边解析, 自顶向下依次解析, 由于边扫描边解析, 所以它解析 XML 具有速度快, 占用内存少的优点。

SAX解析XML的步骤

  1. 创建SAXParserFactory对象
  2. 通过SAXParserFactory对象创建SAXParser对象
  3. 创建DefaultHandler的子类
  4. 调用parse()方法

XML文件

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book id="1001">
        <name>oracle</name>
        <author>WXZ</author>
        <price>15</price>
    </book>
    <book id="1002">
        <name>mysql</name>
        <author>Ning</author>
        <price>36.5</price>
    </book>
</books>

DefaultHandler的子类

class BookDefaultHandler extends DefaultHandler{
    /**
     * 解析XML文件开始时调用
     * @throws SAXException
     */
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        System.out.println("解析XML文件开始");
    }

    /**
     * 解析XML文件结束时调用
     * @throws SAXException
     */
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        System.out.println("解析XML文件结束");
    }

    /**
     * 解析XML文件中的节点时调用
     * @param uri
     * @param localName
     * @param qName
     * @param attributes
     * @throws SAXException
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        if("book".equals(qName)){
            //获取所有属性的长度
            int length = attributes.getLength();
            //遍历属性
            for(int i = 0; i < length; i++){
                String name = attributes.getQName(i);
                String value = attributes.getValue(i);
                System.out.println("属性名:"+name+"\t属性值:"+value);
            }
        }else if(!"books".equals(qName) && !"book".equals(qName)){
            System.out.print("节点名:"+qName+"\t");
        }
    }

    /**
     * 解析XML文件中的节点结束时调用
     * @param uri
     * @param localName
     * @param qName
     * @throws SAXException
     */
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
    }

    /**
     * 获取节点值
     * @param ch
     * @param start
     * @param length
     * @throws SAXException
     */
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        String value = new String(ch,start,length);
        if(!"".equals(value.trim())){
            System.out.println("节点值:"+value);
        }
    }
}

解析过程

/**
 * SAX解析XML
 */
public class SaxXML {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        //(1)创建SAXParserFactory对象
        SAXParserFactory saxParserFactory = new SAXParserFactoryImpl();
        //(2)通过SAXParserFactory对象创建SAXParser对象
        SAXParser parser = saxParserFactory.newSAXParser();
        //(3)创建DefaultHandler的子类
        BookDefaultHandler bookDefaultHandler = new BookDefaultHandler();
        //(4)调用parse()方法
        parser.parse("book.xml",bookDefaultHandler);
    }
}

运行结果:
SAX方式解析XML文件