使用SAX讀取XML
阿新 • • 發佈:2019-01-03
使用SAX讀取XML檔案
1.原理
SAX的工作原理簡單地說就是對文件進行順序掃描,當掃描到文件(document)開始與結束、元素(element)開始與結束、文件(document)結束等地方時通知事件處理函式,由事件處理函式做相應動作,然後繼續同樣的掃描,直至文件結束。
2.優缺點
優點:
可以邊讀邊解析,當XML檔案過大時候相較於DOM消耗的記憶體較小
缺點:
只能讀取不能修改
只能按順序讀取不走回頭路
3.解析步驟
1、得到xml檔案對應的資源,可以是xml的輸入流,檔案和uri
2、得到SAX解析工廠(SAXParserFactory)
3、由解析工廠獲得一個SAX解析器(SAXParser)
4、傳入輸入流和handler給解析器,呼叫parse()解析
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//得到SAX解析工廠(SAXParserFactory)
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//獲得一個SAX解析器(SAXParser)
SAXParser saxParser = saxParserFactory.newSAXParser();
//傳入輸出流和handler給解析器,呼叫parse解析
MyHandle myHandle = new SAXReadXml() .new MyHandle();
saxParser.parse(SAXReadXml.class.getResourceAsStream("/person.xml"),myHandle);
for (Person person : myHandle.persons){
System.out.println(person);
}
}
1.生成一個person.xml檔案
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person>
<name>李四</name>
<age>88</age>
</person>
<person>
<name>張三</name>
<age>58</age>
</person>
</persons>
2.Person類
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
3.Myhandler類繼承DefaultHandler並重寫相關方法
public class MyHandle extends DefaultHandler{
//用於存放Person類的容器
public List<Person> persons;
public Person person;
//用來獲取標籤便於做對應操作
private String tag;
/**
* 收到通知開始讀取文件
* 可以做些初始化話的操作(如:建立輸出檔案)
* */
@Override
public void startDocument() throws SAXException {
}
/**
* 當標籤為persons時建立容器
* 當標籤為person時建立一個person物件
* 其他情況將qName值賦值給tag
* */
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.trim().equals("person")){
person = new Person();
}else if(qName.trim().equals("persons")){
persons = new ArrayList<>();
}else{
tag = qName.trim();
}
}
/**
* 根據tag不同的值獲取對應的資料並對person進行設值
* */
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (tag != null && tag.equals("name")){
person.setName(new String(ch,start,length));
}else if (tag != null && tag.equals("age")){
person.setAge(new Integer(new String(ch,start,length)));
}
}
/**
* 當結束標誌位person時將該person物件加入到容器中
* */
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.trim().equals("person")){
persons.add(person);
}
tag = null;
}
/**
* 收到通知讀取文件結束
* */
@Override
public void endDocument() throws SAXException {
}
}
4.執行結果圖
個人筆記,如有錯誤還望指正!