使用SAX读取XML

1.原理

SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

2.优缺点

优点:
可以边读边解析,当XML文件过大时候相较于DOM消耗的内存较小
缺点:
只能读取不能修改
只能按顺序读取不走回头路

3.解析步骤

1、得到xml文件对应的资源,可以是xml的输入流,文件和uri
2、得到SAX解析工厂(SAXParserFactory)
3、由解析工厂获得一个SAX解析器(SAXParser)
4、传入输入流和handler给解析器,调用parse()解析

	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        //得到SAX解析工厂(SAXParserFactory)
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
       	//获得一个SAX解析器(SAXParser)
        SAXParser saxParser = saxParserFactory.newSAXParser();
        //传入输出流和handler给解析器,调用parse解析
        MyHandle myHandle = new SAXReadXml().new MyHandle();
        saxParser.parse(SAXReadXml.class.getResourceAsStream("/person.xml"),myHandle);
        for (Person person : myHandle.persons){
            System.out.println(person);
        }
    }

1.生成一个person.xml文件

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

<persons>
    <person>
        <name>李四</name>
        <age>88</age>
    </person>
    <person>
        <name>张三</name>
        <age>58</age>
    </person>
</persons>

2.Person类

public class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
  	 }
  }

3.Myhandler类继承DefaultHandler并重写相关方法

public class MyHandle extends DefaultHandler{
        //用于存放Person类的容器
        public List<Person> persons;
        public Person person;
        //用来获取标签便于做对应操作
        private String tag;
       /**
         * 收到通知开始读取文档
         * 可以做些初始化话的操作(如:创建输出文件)
         * */
        @Override
        public void startDocument() throws SAXException {
        }
		/**
         * 当标签为persons时创建容器
         * 当标签为person时创建一个person对象
         * 其他情况将qName值赋值给tag
         * */
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            if (qName.trim().equals("person")){
                person = new Person();
            }else if(qName.trim().equals("persons")){
                persons = new ArrayList<>();
            }else{
                tag = qName.trim();
            }
        }
		/**
         * 根据tag不同的值获取对应的数据并对person进行设值
         * */
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            if (tag != null && tag.equals("name")){
                person.setName(new String(ch,start,length));
            }else if (tag != null && tag.equals("age")){
                person.setAge(new Integer(new String(ch,start,length)));
            }
        }
		/**
         * 当结束标志位person时将该person对象加入到容器中
         * */
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            if (qName.trim().equals("person")){
                persons.add(person);
            }
            tag = null;
        }
		/**
         * 收到通知读取文档结束
         * */
        @Override
        public void endDocument() throws SAXException {
        }

    }

4.运行结果图

在这里插入图片描述

个人笔记,如有错误还望指正!

猜你喜欢

转载自blog.csdn.net/fxl5202301/article/details/85253651