By GokiSoft.com| 20:01 12/04/2023|
Java Advanced

[Source Code] Phân tích tài liệu XML bằng SAX Parser - C2206L

Parser -> Phan tich tai lieu xml bang ngon ngu lap trinh
	- DOM parser
		- Uu diem: Phan tich vs moi tai lieu xml -> XPath
		- Nhuoc diem: Ton bo nho, chay cham
		-> Khong dung cach nay
	- SAXP parser
		- Uu diem: Nhanh, ton it bo nho
		- Nhuoc diem: Phan tich xong -> Huy du luon
					  Moi 1 tai lieu xml -> Co 1 bo phan tich rieng -> Biet trc dc cau truc xml la gi???
		-> Su dung cach nay

#test01.xml

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

<student-list>
	<student>
		<fullname>TRAN VAN A</fullname>
		<email>a@gmail.com</email>
		<address>Ha Noi</address>
		<phone-number>123123123</phone-number>
		<age>22</age>
	</student>
	<student>
		<fullname>TRAN VAN B</fullname>
		<email>a@gmail.com</email>
		<address>Ha Noi</address>
		<phone-number>123123123</phone-number>
		<age>22</age>
	</student>
</student-list>

#Main.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.gokisoft.xml.lesson01;

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;

/**
 *
 * @author teacher
 */
public class Main {
    public static void main(String[] args) {
        try {
            File f = new File("test01.xml");
            
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            StudentHandler handler = new StudentHandler();
            parser.parse(f, handler);
            
            handler.getDataList().forEach((student) -> {
                student.display();
            });
        } catch (ParserConfigurationException | SAXException | IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

#Student.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.gokisoft.xml.lesson01;

/**
 *
 * @author teacher
 */
public class Student implements IHandler{
    String fullname;
    String email;
    String address;
    String phoneNumber;
    int age;
    
    boolean isFullname = false;
    boolean isAddress = false;
    boolean isEmail = false;
    boolean isPhoneNumber = false;
    boolean isAge = false;

    public Student() {
    }

    public String getFullname() {
        return fullname;
    }

    public void setFullname(String fullname) {
        this.fullname = fullname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "fullname=" + fullname + ", email=" + email + ", address=" + address + ", phoneNumber=" + phoneNumber + ", age=" + age;
    }
    
    public void display() {
        System.out.println(this);
    }

    @Override
    public void startElement(String qName) {
        switch (qName) {
            case "fullname":
                isFullname = true;
                break;
            case "email":
                isEmail = true;
                break;
            case "address":
                isAddress = true;
                break;
            case "phone-number":
                isPhoneNumber = true;
                break;
            case "age":
                isAge = true;
                break;
        }
    }

    @Override
    public void endElement(String qName) {
        switch (qName) {
            case "fullname":
                isFullname = false;
                break;
            case "email":
                isEmail = false;
                break;
            case "address":
                isAddress = false;
                break;
            case "phone-number":
                isPhoneNumber = false;
                break;
            case "age":
                isAge = false;
                break;
        }
    }

    @Override
    public void characters(String value) {
        if (isFullname) {
            setFullname(value);
        } else if(isEmail) {
            setEmail(value);
        } else if(isAddress) {
            setAddress(value);
        } else if(isPhoneNumber) {
            setPhoneNumber(value);
        } else if(isAge) {
            setAge(Integer.parseInt(value));
        }
    }
}

#StudentHandler.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.gokisoft.xml.lesson01;

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

/**
 *
 * @author teacher
 */
public class StudentHandler extends DefaultHandler {
    List<Student> dataList = new ArrayList<>();
    Student currStudent = null;

    boolean isFullname = false;
    boolean isAddress = false;
    boolean isEmail = false;
    boolean isPhoneNumber = false;
    boolean isAge = false;

    public StudentHandler() {
    }

    public List<Student> getDataList() {
        return dataList;
    }
    
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        qName = qName.toLowerCase();
        switch (qName) {
            case "student":
                currStudent = new Student();
                break;
            case "fullname":
                isFullname = true;
                break;
            case "email":
                isEmail = true;
                break;
            case "address":
                isAddress = true;
                break;
            case "phone-number":
                isPhoneNumber = true;
                break;
            case "age":
                isAge = true;
                break;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        qName = qName.toLowerCase();
        switch (qName) {
            case "student":
                dataList.add(currStudent);
                currStudent = null;
                break;
            case "fullname":
                isFullname = false;
                break;
            case "email":
                isEmail = false;
                break;
            case "address":
                isAddress = false;
                break;
            case "phone-number":
                isPhoneNumber = false;
                break;
            case "age":
                isAge = false;
                break;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String value = new String(ch, start, length);

        if (isFullname) {
            currStudent.setFullname(value);
        } else if(isEmail) {
            currStudent.setEmail(value);
        } else if(isAddress) {
            currStudent.setAddress(value);
        } else if(isPhoneNumber) {
            currStudent.setPhoneNumber(value);
        } else if(isAge) {
            currStudent.setAge(Integer.parseInt(value));
        }
    }
}

#test02.xml

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

<class-list>
	<class>
		<info>
			<name>C2206L</name>
			<address>54 Le Thanh Nghi</address>
		</info>
		<student-list>
			<student>
				<fullname><![CDATA[TRAN VAN A *&^23468 adg<> sdkfh weru2384(*&^]]></fullname>
				<email>a@gmail.com</email>
				<address>Ha Noi</address>
				<phone-number>123123123</phone-number>
			</student>
			<student>
				<fullname>TRAN VAN B</fullname>
				<email>a@gmail.com</email>
				<address>Ha Noi</address>
				<phone-number>123123123</phone-number>
			</student>
		</student-list>
	</class>
	<class>
		<info>
			<name>C2206G</name>
			<address>54 Le Thanh Nghi</address>
		</info>
		<student-list>
			<student>
				<fullname>TRAN VAN A</fullname>
				<email>a@gmail.com</email>
				<address>Ha Noi</address>
				<phone-number>123123123</phone-number>
			</student>
			<student>
				<fullname>TRAN VAN B</fullname>
				<email>a@gmail.com</email>
				<address>Ha Noi</address>
				<phone-number>123123123</phone-number>
			</student>
		</student-list>
	</class>
</class-list>

#ClassHanlder.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.gokisoft.xml.lesson01;

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

/**
 *
 * @author teacher
 */
public class ClassHanlder extends DefaultHandler {

    List<Classs> classList = new ArrayList<>();
    Classs currClass = null;

    public List<Classs> getClassList() {
        return classList;
    }
    
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        qName = qName.toLowerCase();
        if (qName.equals("class")) {
            currClass = new Classs();
        } else {
            if (currClass != null) {
                currClass.startElement(qName);
            }
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        qName = qName.toLowerCase();
        if (qName.equals("class")) {
            classList.add(currClass);
            currClass = null;
        } else {
            if (currClass != null) {
                currClass.endElement(qName);
            }
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String value = new String(ch, start, length);
        if (currClass != null) {
            currClass.characters(value);
        }
    }
}

#Classs.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.gokisoft.xml.lesson01;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author teacher
 */
public class Classs implements IHandler {

    Info info;
    List<Student> studentList;

    Student currStudent = null;

    boolean isInfo = false;
    boolean isStudent = false;

    public Classs() {
        studentList = new ArrayList<>();
    }

    public void display() {
        System.out.println("=== THONG TIN LOP HOC ===");
        info.display();
        System.out.println("+ DANH SACH SINH VIEN");
        studentList.forEach((student) -> {
            student.display();
        });
    }

    @Override
    public void startElement(String qName) {
        switch (qName) {
            case "info":
                isInfo = true;
                info = new Info();
                break;
            case "student":
                currStudent = new Student();
                isStudent = true;
                break;
            default:
                if (isInfo) {
                    info.startElement(qName);
                }
                if (isStudent) {
                    currStudent.startElement(qName);
                }
                break;
        }
    }

    @Override
    public void endElement(String qName) {
        switch (qName) {
            case "info":
                isInfo = false;
                break;
            case "student":
                studentList.add(currStudent);
                currStudent = null;
                isStudent = false;
                break;
            default:
                if (isInfo) {
                    info.endElement(qName);
                }
                if (isStudent) {
                    currStudent.endElement(qName);
                }
                break;
        }
    }

    @Override
    public void characters(String value) {
        if (isInfo) {
            info.characters(value);
        }
        if (isStudent) {
            currStudent.characters(value);
        }
    }
}

#IHandler.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.gokisoft.xml.lesson01;

/**
 *
 * @author teacher
 */
public interface IHandler {
    void startElement(String qName);
    void endElement(String qName);
    void characters(String value);
}

#Info.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.gokisoft.xml.lesson01;

/**
 *
 * @author teacher
 */
public class Info implements IHandler{
    String name;
    String address;
    
    boolean isName = false;
    boolean isAddress = false;

    public Info() {
    }

    public String getName() {
        return name;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "name=" + name + ", address=" + address;
    }
    
    public void display() {
        System.out.println(this);
    }

    @Override
    public void startElement(String qName) {
        switch(qName) {
            case "name":
                isName = true;
                break;
            case "address":
                isAddress = true;
                break;
        }
    }

    @Override
    public void endElement(String qName) {
        switch(qName) {
            case "name":
                isName = false;
                break;
            case "address":
                isAddress = false;
                break;
        }
    }

    @Override
    public void characters(String value) {
        if(isName) {
            name = value;
        } else if(isAddress) {
            address = value;
        }
    }
}

#Student.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.gokisoft.xml.lesson01;

/**
 *
 * @author teacher
 */
public class Student implements IHandler{
    String fullname;
    String email;
    String address;
    String phoneNumber;
    int age;
    
    boolean isFullname = false;
    boolean isAddress = false;
    boolean isEmail = false;
    boolean isPhoneNumber = false;
    boolean isAge = false;

    public Student() {
    }

    public String getFullname() {
        return fullname;
    }

    public void setFullname(String fullname) {
        this.fullname = fullname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "fullname=" + fullname + ", email=" + email + ", address=" + address + ", phoneNumber=" + phoneNumber + ", age=" + age;
    }
    
    public void display() {
        System.out.println(this);
    }

    @Override
    public void startElement(String qName) {
        switch (qName) {
            case "fullname":
                isFullname = true;
                break;
            case "email":
                isEmail = true;
                break;
            case "address":
                isAddress = true;
                break;
            case "phone-number":
                isPhoneNumber = true;
                break;
            case "age":
                isAge = true;
                break;
        }
    }

    @Override
    public void endElement(String qName) {
        switch (qName) {
            case "fullname":
                isFullname = false;
                break;
            case "email":
                isEmail = false;
                break;
            case "address":
                isAddress = false;
                break;
            case "phone-number":
                isPhoneNumber = false;
                break;
            case "age":
                isAge = false;
                break;
        }
    }

    @Override
    public void characters(String value) {
        if (isFullname) {
            setFullname(value);
        } else if(isEmail) {
            setEmail(value);
        } else if(isAddress) {
            setAddress(value);
        } else if(isPhoneNumber) {
            setPhoneNumber(value);
        } else if(isAge) {
            setAge(Integer.parseInt(value));
        }
    }
}

#Test.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.gokisoft.xml.lesson01;

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;

/**
 *
 * @author teacher
 */
public class Test {

    public static void main(String[] args) {
        try {
            File f = new File("test02.xml");

            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            ClassHanlder handler = new ClassHanlder();
            parser.parse(f, handler);

            handler.getClassList().forEach((cls) -> {
                cls.display();
            });
        } catch (ParserConfigurationException | SAXException | IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
Tags:



Phản hồi từ học viên

5

(Dựa trên đánh giá ngày hôm nay)

Đăng nhập để làm bài kiểm tra

Chưa có kết quả nào trước đó