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)