SAX順序讀取XMl文件時,並非一次性將XML文件讀到內存中去,而是一段一段的讀到內存中。SAX的解析器是基於事件的模型,解析XML文件時會觸發一系列事件。SAX佔用內存小、處理靈活,對於手機端的開發比較適合。
如果需要對XMl文件反覆操作,並且做修改等動作,SAX就不適合了。
案例:簡單讀取XMl文件中的內容
1、 通過繼承DefaultHandler,並重寫四個函數即可完成解析操作
public class MyXmlReadHandler extends DefaultHandler{
private String tagName;
private Student student = null;
private List<Student> lists = null;
public List<Student> getLists() {
return lists;
}
/**
* 讀取XML文件開始(初始化集合對象)
*/
@Override
public void startDocument() throws SAXException {
lists = new ArrayList<Student>();
}
/**
* 讀取標籤開始(初始化student對象)
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
tagName = qName;
if(tagName.equals("student")){
student = new Student();
}
}
/**
* 讀取標籤內容(給對象student屬性賦值)
* 通過簡單的if-else判斷方式
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (tagName != null) {
String data = new String(ch, start, length);
if (tagName.equals("name")) {
student.setName(data);
}else if (tagName.equals("age")) {
student.setAge(data);
}else if (tagName.equals("sex")) {
student.setSex(data);
}
}
}
/**
* 讀取標籤內容結束(給集合對象賦值)
* 並注意:tagName = null
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(qName.equals("student")){
lists.add(student);
}
tagName = null;
}
}
2、 調用方法
public class XmlSax {
public static void main(String[] args) throws Exception {
InputStream ins = Thread.currentThread().getContextClassLoader().getResourceAsStream("students.xml");
MyXmlReadHandler readHandler = new MyXmlReadHandler();
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser sp = factory.newSAXParser();
sp.parse(ins, readHandler);
ins.close();
List<Student> lists = readHandler.getLists();
for (Student person : lists) {
System.out.println("--------------");
System.out.println("name:"+person.getName());
System.out.println("age:"+person.getAge());
System.out.println("sex:"+person.getSex());
}
}
}
3、 XML文件
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id='0001'>
<name>stu01</name>
<age>20</age>
<sex>男</sex>
</student>
<student id='0002'>
<name>stu02</name>
<age>22</age>
<sex>女</sex>
</student>
</students>
4、 執行結果