通過SAX解析xml文件,由四部分組成,xml文件,文件存儲類,解析類,處理器類。
以下爲xml文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE students[
<!ELEMENT students (student+)>
<!ELEMENT student (sname,sage,ssex)>
<!ELEMENT sname (#PCDATA) >
<!ELEMENT sage (#PCDATA) >
<!ELEMENT ssex (#PCDATA) >
]>
<students>
<student>
<sname>萬星明</sname>
<sage>23</sage>
<ssex>男</ssex>
</student>
<student>
<sname>盧玉梟</sname>
<sage>25</sage>
<ssex>女</ssex>
</student>
<student>
<sname>李前飛</sname>
<sage>24</sage>
<ssex>女</ssex>
</student>
</students>
以下是學生類,用於創建學生對象,存儲從xml文件中讀取的對象數據
/**
* @author 萬星明
* @version 創建時間:2018年10月24日 上午10:51:17
* 學生信息類
*/
public class Student {
private String name;
private Integer age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
以下是解析類,通過處理器,解析xml文件,將數據裝入對象中,然後將對象放入集合
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
/**
* @author 萬星明
* @version 創建時間:2018年10月24日 上午10:54:02
* 類說明
*/
public class SaxParser {
public static void main(String[] args) throws Exception {
//創建sax解析器工廠對象
SAXParserFactory factory = SAXParserFactory.newInstance();
//通過sax解析器工廠對象創建sax解析器對象
SAXParser sp = factory.newSAXParser();
//創建處理器對象
StudentHandler sh = new StudentHandler();
//用sax解析器解析xml文檔,並按處理器處理方式來解析內容
sp.parse("XML//Students.xml",sh);
//接收解析結果
List<Student> stuList=sh.stuList;
System.out.println("姓名\t年齡\t性別");
for (Student s : stuList) {
System.out.println(s.getName()+"\t"+s.getAge()+"\t"+s.getSex());
}
}
}
以下是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;
/**
* @author 萬星明
* @version 創建時間:2018年10月24日 上午11:09:34
* 學生xml處理類
*/
public class StudentHandler extends DefaultHandler {
//存儲解析出的Student對象的集合
public List<Student> stuList = null;
//聲明一個變量,存儲每次解析的標籤名
public String lable;
//聲明student變量
public Student stu;
//重寫開始解析文檔的方法
@Override
public void startDocument() throws SAXException {
stuList = new ArrayList<>();
// super.startDocument();
}
//重寫開始解析標籤的方法
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//解析到student標籤時,創建Student實例對象
lable = qName;
if(lable.equals("student")) {
stu = new Student();
}
// super.startElement(uri, localName, qName, attributes);
}
//重寫解析標籤內容的方法
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String data = new String(ch,start,length);
if(lable.equals("sname")) {
stu.setName(data);
}else if(lable.equals("sage")){
stu.setAge(Integer.valueOf(data));
}else if(lable.equals("ssex")) {
stu.setSex(data);
}
// super.characters(ch, start, length);
}
//重寫結束解析標籤的方法
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if(qName.equals("student")) {
stuList.add(stu);
}
// super.endElement(uri, localName, qName);
}
//重寫結束解析文檔的方法
@Override
public void endDocument() throws SAXException {
// super.endDocument();
}
}