1. 程式人生 > >使用SAX讀取XML

使用SAX讀取XML

使用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.執行結果圖

在這裡插入圖片描述

個人筆記,如有錯誤還望指正!