sax方式解析xml的優(yōu)點:
只要有jdk的存在,嚴(yán)格意義上來說是jre,它就可以運行,不依賴任何第三方的jar包。在移動設(shè)備上尤為廣泛使用。比如Android就使用它來解析xml。當(dāng)然Android更為推薦的是采用xmlpull來解析xml。這種方式也同樣適合javase。我在后期會為大家準(zhǔn)備使用xmlpull解析xml的demo。敬請關(guān)注。
xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<student id="1" group="1">
<name>張三</name>
<sex>男</sex>
<age>18</age>
<email>zhangsan@163.com</email>
<birthday>1987-06-08</birthday>
<memo>好學(xué)生</memo>
</student>
<student id="2" group="2">
<name>李四</name>
<sex>女</sex>
<age>18</age>
<email>lisi@163.com</email>
<birthday>1987-06-08</birthday>
<memo>好學(xué)生</memo>
</student>
<student id="3" group="3">
<name>小王</name>
<sex>男</sex>
<age>18</age>
<email>xiaowang@163.com</email>
<birthday>1987-06-08</birthday>
<memo>好學(xué)生</memo>
</student>
<student id="4" group="4">
<name>小張</name>
<sex>男</sex>
<age>18</age>
<email>xiaozhang@163.com</email>
<birthday>1987-06-08</birthday>
<memo>好學(xué)生</memo>
</student>
<student id="5" group="5">
<name>小明</name>
<sex>男</sex>
<age>18</age>
<email>xiaoming@163.com</email>
<birthday>1987-06-08</birthday>
<memo>好學(xué)生</memo>
</student>
</root>
xml對應(yīng)的Javabean:
package com.parsexml.entity;
public class Student {
private int id;
private int group;
private String name;
private String sex;
private int age;
private String email;
private String memo;
private String birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getGroup() {
return group;
}
public void setGroup(int group) {
this.group = group;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}
開始解析:
package com.parsexml;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.parsexml.entity.Student;
/**
* 功能描述:采用sax方式解析XML<br>
*
* @author sxyx2008
*
*/
public class SaxParseXml extends DefaultHandler{
//存放遍歷集合
private List<Student> list;
//構(gòu)建Student對象
private Student student;
//用來存放每次遍歷后的元素名稱(節(jié)點名稱)
private String tagName;
public List<Student> getList() {
return list;
}
public void setList(List<Student> list) {
this.list = list;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public String getTagName() {
return tagName;
}
public void setTagName(String tagName) {
this.tagName = tagName;
}
//只調(diào)用一次 初始化list集合
@Override
public void startDocument() throws SAXException {
list=new ArrayList<Student>();
}
//調(diào)用多次 開始解析
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if(qName.equals("student")){
student=new Student();
//獲取student節(jié)點上的id屬性值
student.setId(Integer.parseInt(attributes.getValue(0)));
//獲取student節(jié)點上的group屬性值
student.setGroup(Integer.parseInt(attributes.getValue(1)));
}
this.tagName=qName;
}
//調(diào)用多次
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(qName.equals("student")){
this.list.add(this.student);
}
this.tagName=null;
}
//只調(diào)用一次
@Override
public void endDocument() throws SAXException {
}
//調(diào)用多次
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(this.tagName!=null){
String date=new String(ch,start,length);
if(this.tagName.equals("name")){
this.student.setName(date);
}
else if(this.tagName.equals("sex")){
this.student.setSex(date);
}
else if(this.tagName.equals("age")){
this.student.setAge(Integer.parseInt(date));
}
else if(this.tagName.equals("email")){
this.student.setEmail(date);
}
else if(this.tagName.equals("birthday")){
this.student.setBirthday(date);
}
else if(this.tagName.equals("memo")){
this.student.setMemo(date);
}
}
}
public static void main(String[] args) {
SAXParser parser = null;
try {
//構(gòu)建SAXParser
parser = SAXParserFactory.newInstance().newSAXParser();
//實例化 DefaultHandler對象
SaxParseXml parseXml=new SaxParseXml();
//加載資源文件 轉(zhuǎn)化為一個輸入流
InputStream stream=SaxParseXml.class.getClassLoader().getResourceAsStream("Student.xml");
//調(diào)用parse()方法
parser.parse(stream, parseXml);
//遍歷結(jié)果
List<Student> list=parseXml.getList();
for(Student student:list){
System.out.println("id:"+student.getId()+"\tgroup:"+student.getGroup()+"\tname:"+student.getName()+"\tsex:"+student.getSex()+"\tage:"+student.getAge()+"\temail:"+student.getEmail()+"\tbirthday:"+student.getBirthday()+"\tmemo:"+student.getMemo());
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
效果圖:

注:如需運行代碼,添加Student.xml到你的src目錄下即可
點我下載demo