Java Sax 初学

1.创建SAXParserFactory 实例。
    SAXParserFactory factor = SAXParserFactory.newInstance();
2.通过SAXParserFactory 实例创建解析器实例。
    SAXParser parser = factor.newSAXParser();
3.设置文件读入流
    InputStream is = Demo1.class.getClassLoader().getResourceAsStream("Student.xml");
4.创建Handler实例
    class myHandle extends DefaultHandler{
    。。。。。
    }
5.调用解析器方法  
    parser.parse(is,dh);


重点:DefaultHandler 子类方法的重写
  概述:
          startDocument():只会在文档开始解析的时候被调用,每次解析只会调用一次。
          startElement():每次开始解析一个元素,即遇到元素标签开始的时候都会调用。
          characters():每次解析到元素标签携带的内容时都会调用,即使该元素标签的内容为空或换行。可以使用new String(ch,off,len)获取内容。
          endElement():每次结束解析一个元素,即遇到元素标签结束的时候都会调用。

          endDocument():只会在文档解析结束的时候被调用,每次解析只会调用一次。


代码如下:

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

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 Demo1 {
    public static void main(String[] args) throws Exception, Throwable {
        SAXParserFactory factor = SAXParserFactory.newInstance();
        SAXParser parser = factor.newSAXParser();
        InputStream is = Demo1.class.getClassLoader().getResourceAsStream("Student.xml");
        myHandle dh = new myHandle();
        parser.parse(is, dh);
        List<Student> list =  dh.getList();
        for (Student student : list) {
            System.out.println(student);
        }
    }
}
class myHandle extends DefaultHandler{
    
    private List<Student> list = null;
    Student stu = null;
    String currName = null;
    @Override
    public void startDocument() throws SAXException {
        list = new ArrayList<Student>();
    }
    @Override
    public void endDocument() throws SAXException {
    }
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attr) throws SAXException {
        if("stu".equals(qName)){
            stu = new Student();
            /*stu.setName(qName);
            stu.setAge(Integer.parseInt(qName));
            stu.setGender(qName);*/
        }
        currName = qName;
    }
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if("stu".equals(qName)){
            list.add(stu);
            stu = null;
        }
        currName = null;//如果此处不赋空值,在接下来,读完节点,读空白时,会把空白赋值。例如,此时的currName = name;读完name节点,会去读取空白元素,此时重新调用characters方法,进入if("name")分支导致name 空白
      
    }
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String content = new String(ch,start,length);
        if(currName!=null){
            if("name".equals(currName)){
                stu.setName(content);
            }else if("age".equals(currName)){
                stu.setAge(Integer.parseInt(content));
            }else if("gender".equals(currName)){
                stu.setGender(content);
            }else if("email".equals(currName)){
                stu.setEmail(content);
            }
        }
    }
    public List<Student> getList(){
        return list;
    }
}

 


 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值