SAX解析

package cn.itcast;

import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyDefaultHandler extends DefaultHandler {
    private String qName;
    private Student student;
    private String node;
    private boolean flag = false;
    public static List<Student>list = null;
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        list = new ArrayList<>();//在文档开始出创建一个集合用于存储学生对象
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        flag = true;//标志着标签的开始
        this.qName = qName;
        if(qName.equals("student")){
            student = new Student();
            String value = attributes.getValue(0);//获取学生的属性
            student.setId(value);
        }
        node = qName;
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        if(!flag){//如果flag为true则表示开始标签,需要对student对象属性设置,如果为false则表示结束标签,不进行student的属性设置
            return;
        }
        switch(node){
            case "name"://name有两个结点,一个是开始标签一个是结束标签。而开始标签和结束标签执行完后都是文本。
                String strName = new String(ch,start,length);
                student.setName(strName);//设置姓名
                break;
            case "age":
                String str = new String(ch,start,length);
                int age = Integer.parseInt(str);
                student.setAge(age);//设置年龄

                break;
            case "sex":
                student.setSex(new String(ch,start,length));//设置性别
                break;
        }

    }
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        flag = false;//表示标签的结束

        if(qName.equals("student")){//碰到student结束标签则把student添加到集合中
            list.add(student);
        }
    }
    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.endDocument();
    }
}
package cn.itcast;

import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class SAXParserDemo {

    public static void main(String[] args) throws Exception {
        //创建一个SAXParser工厂
        SAXParserFactory saxPareserFactory = SAXParserFactory.newInstance();
        //通过工厂生产一个SAXParser
        SAXParser newSAXParser = saxPareserFactory.newSAXParser();
        newSAXParser.parse("Student.xml", new MyDefaultHandler());
        List<Student> list = MyDefaultHandler.list;
        for(Student stu : list){
            System.out.println(stu);
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楚蕊博南谭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值