Java——SAX解析XML文件

SAX适用于只读取XML文件内容的情况,因为SAX是一种边读边解析的模式,所以不需要直接将XML文件直接塞入内存,读取速度也更快,但是只能读。
SAX解析主要有两个部分:①解析器②事件处理器
过程:

// 创建解析器工厂、获取解析器
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        // 创建xml读取器,绑定事件处理器
        XMLReader reader = parser.getXMLReader();
        GetStuInfoHandler stuHandler = new GetStuInfoHandler();
        reader.setContentHandler(stuHandler);
        reader.parse("src/com/keixn/day3/stu_info.xml");

而读取器绑定的事件处理器需要继承ContentHandler接口或者继承他的子类(常用),然后重写需要的方法。这个事件处理器当读取器读取xml文件内容时便会触发相应的方法。
下面使用SAX解析XML文件,并将获取的内容封装成JavaBean便于数据处理:

package com.keixn.day3;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

/**
 * 使用SAX解析XML文件并封装到JavaBean对象中
 * 
 * @author KeXin
 *
 */
public class Demo {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        // 创建解析器工厂、获取解析器
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        // 创建xml读取器,绑定事件处理器
        XMLReader reader = parser.getXMLReader();
        GetStuInfoHandler stuHandler = new GetStuInfoHandler();
        reader.setContentHandler(stuHandler);
        reader.parse("src/com/keixn/day3/stu_info.xml");
        List stu_list = stuHandler.GetStuList();
        for(Student stu:stu_list){
            System.out.println(stu.GetStu(stu));
        }
    }
}

class GetStuInfoHandler extends DefaultHandler {
    private final String STU = "stu", EXAM = "exam", EXAMID = "examid", IDCARD = "idcard", NAME = "name",
            LOCATION = "location", GRADE = "grade";
    Student stu;
    private static String flag;
    private List stu_list = new ArrayList<>();

    public List GetStuList() {
        return stu_list;
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        // 每次解析到一个标签都会触发该方法
        if (qName.equals(STU)) {
            stu = new Student();
            // 获取stu标签内的属性值
            if (attributes != null) {
                stu.setExamid(attributes.getValue(EXAMID));
                stu.setIdcard(attributes.getValue(IDCARD));
            }
        } else if (qName.equals(NAME)) {
            flag = NAME;
        } else if (qName.equals(LOCATION)) {
            flag = LOCATION;
        } else if (qName.equals(GRADE)) {
            flag = GRADE;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if(flag==null) return;
        switch (flag) {
        case NAME:
            stu.setName(new String(ch, start, length));
            break;
        case LOCATION:
            stu.setLocation(new String(ch, start, length));
            break;
        case GRADE:
            stu.setGrade(new String(ch, start, length));
            break;
        default:
            break;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if(qName.equals(STU)){
            stu_list.add(stu);
        }
        flag = null;
    }
}

相应的stu_info.xml:


<exam>
    <stu examid="000" idcard="122">
        <name>lisaname>
        <location>北京location>
        <grade>78grade>
    stu>
exam>

你可能感兴趣的:(java高级特性)