Java——SAX解析XML檔案
阿新 • • 發佈:2019-01-03
SAX適用於只讀取XML檔案內容的情況,因為SAX是一種邊讀邊解析的模式,所以不需要直接將XML檔案直接塞入記憶體,讀取速度也更快,但是隻能讀。
SAX解析主要有兩個部分:①解析器②事件處理器
過程:
// 建立解析器工廠、獲取解析器
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
// 建立xml讀取器,繫結事件處理器
XMLReader reader = parser.getXMLReader ();
GetStuInfoHandler stuHandler = new GetStuInfoHandler();
reader.setContentHandler(stuHandler);
reader.parse("src/com/keixn/day3/stu_info.xml");
而讀取器繫結的事件處理器需要繼承ContentHandler介面或者繼承他的子類(常用),然後重寫需要的方法。這個事件處理器當讀取器讀取xml檔案內容時便會觸發相應的方法。
下面使用SAX解析XML檔案,並將獲取的內容封裝成JavaBean便於資料處理:
package com.keixn.day3;
import java.io.IOException;
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.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
/**
* 使用SAX解析XML檔案並封裝到JavaBean物件中
*
* @author KeXin
*
*/
public class Demo {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
// 建立解析器工廠、獲取解析器
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
// 建立xml讀取器,繫結事件處理器
XMLReader reader = parser.getXMLReader();
GetStuInfoHandler stuHandler = new GetStuInfoHandler();
reader.setContentHandler(stuHandler);
reader.parse("src/com/keixn/day3/stu_info.xml");
List<Student> stu_list = stuHandler.GetStuList();
for(Student stu:stu_list){
System.out.println(stu.GetStu(stu));
}
}
}
class GetStuInfoHandler extends DefaultHandler {
private final String STU = "stu", EXAM = "exam", EXAMID = "examid", IDCARD = "idcard", NAME = "name",
LOCATION = "location", GRADE = "grade";
Student stu;
private static String flag;
private List<Student> stu_list = new ArrayList<>();
public List GetStuList() {
return stu_list;
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// 每次解析到一個標籤都會觸發該方法
if (qName.equals(STU)) {
stu = new Student();
// 獲取stu標籤內的屬性值
if (attributes != null) {
stu.setExamid(attributes.getValue(EXAMID));
stu.setIdcard(attributes.getValue(IDCARD));
}
} else if (qName.equals(NAME)) {
flag = NAME;
} else if (qName.equals(LOCATION)) {
flag = LOCATION;
} else if (qName.equals(GRADE)) {
flag = GRADE;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(flag==null) return;
switch (flag) {
case NAME:
stu.setName(new String(ch, start, length));
break;
case LOCATION:
stu.setLocation(new String(ch, start, length));
break;
case GRADE:
stu.setGrade(new String(ch, start, length));
break;
default:
break;
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if(qName.equals(STU)){
stu_list.add(stu);
}
flag = null;
}
}
相應的stu_info.xml:
<?xml version="1.0" encoding="UTF-8"?>
<exam>
<stu examid="000" idcard="122">
<name>lisa</name>
<location>北京</location>
<grade>78</grade>
</stu>
</exam>