Java SAX解析


sax解析 一行一行的解析,針對數據量較大的
dom解析 將整個數據加載,針對數據較小的
 
 sax步驟
1、獲得解析工廠 SAXParserFactory
2、工廠獲取解析器 SAXParser
3、加載文檔Document注冊處理器

 

1、首先寫一個xml    

person.xml

<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person>
        <name>至尊寶</name>
        <age>90000</age>
    </person>
    <person>
        <name>紫霞</name>
        <age>10000</age>
    </person>
</persons>

2、Persond類(准備)

Persond.java

package xml;
/*
 * sax解析 一行一行的解析,針對數據量較大的
 * dom解析 將整個數據加載,針對數據較小的
 * 
 * sax步驟
 * 1、獲得解析工廠 SAXParserFactory
 * 2、工廠獲取解析器 SAXParser
 * 3、加載文檔Document注冊處理器
 */
public class Persond {
    private String name;
    private int age;
    
    public Persond() {
        
    }
    public Persond(String name, int age) {
        super();
        this.name = name;
        this.age = 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;
    }
}

3、注冊處理器(存儲對象)

PersonHandler.java

package xml;

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 PersonHandler extends DefaultHandler {
    private List<Persond> persons;
    private Persond person;
    private String tag;  //記錄標簽名

    @Override
    public void startDocument() throws SAXException {
//        System.out.println("處理文檔開始");
        persons=new ArrayList<Persond>();
    }
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("開始一個元素"+qName);
        if(null!=qName) {
            tag=qName;
        }
        if(null!=qName&&qName.equals("person")) {
            person=new Persond();
        }
    }
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String str=new String(ch,start,length);
        if(null!=tag&&tag.equals("name")) {
//            System.out.println(new String(ch,start,length));
            //存數據
            person.setName(str);
            
        }else if(null!=tag&&tag.equals("age")) {
            Integer age=Integer.valueOf(str);
            person.setAge(age);
        }
        
    }
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
//        System.out.println("結束一個元素"+qName);
        if(qName.equals("person")) {
            this.persons.add(person);
        }
        tag=null;
    }


    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("文檔處理結束");
    }
    public List<Persond> getPersons() {
        return persons;
    }
    public void setPersons(List<Persond> persons) {
        this.persons = persons;
    }
    
    
}

4、正式解析

ParseDemo01.java

package xml;

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

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class ParseDemo01 {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        //1、獲取解析工廠   SAXParserFactory是protect類型,所以用他的靜態方法
        SAXParserFactory  factory=SAXParserFactory.newInstance();
        //2、從解析工廠獲取解析器
        SAXParser parse=factory.newSAXParser();
        //3、加載文檔Document注冊處理器
        //4、編寫處理器
        PersonHandler handler=new PersonHandler();
        parse.parse(Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("xml/person.xml")
                , handler);
        List<Persond> personds=handler.getPersons();     //得到一個List對象,里面包含兩個Persond類型的對象<person1,person2>
        
        for(Persond p:personds) {
            System.out.println(p.getName()+"-->"+p.getAge());
        }
    }
}

打印結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM