XML:
可擴展標記語言
1、充當顯示數據
2、儲存數據
3、傳輸數據
SAX:
基於事假驅動,順序讀寫,速度快
不能任意讀取節點,靈活性差
解析時,占用內存小
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class Demo{
public static void main(String[] args) throws IOException, SAXException, ParserConfigurationException {
xmlTest();
}
public static void xmlTest() throws ParserConfigurationException, SAXException, IOException {
//創建一個SAX解析器工廠對象;
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//通過工廠對象創建SAX解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
//創建一個數據處理器(自己實現)
PersonHandle personHandle = new PersonHandle();
//開始解析
InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml");
saxParser.parse(resourceAsStream,personHandle);
List<Person> persons = personHandle.getPersons();
for(Person p:persons){
System.out.println(p+",p");
}
}
}
class Person{
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
class PersonHandle extends DefaultHandler {
private List<Person> persons = null;
private String tag; //用來存儲當前解析的標簽名字
private Person person=null;
public List<Person> getPersons() {
return persons;
}
//開始解析文檔時調用,只會執行一次
@Override
public void startDocument() throws SAXException {
super.startDocument();
persons = new ArrayList<>();
System.out.println("開始解析文檔.....");
}
//結束解析文檔時調用
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("結束解析文檔.....");
}
//每一個標簽開始時調用
/**
*
* @param uri:命名空間
* @param localName :不帶前綴的標簽名 <a:person person_id="p1"> -->獲取的是person
* @param qName:帶前綴的標簽名 <a:person person_id="p1"> -->獲取的是a:person
* @param attributes:當前標簽屬性 <a:person person_id="p1">
* @throws SAXException
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
//獲取每一個標簽的person_id屬性,如果沒有返回null;
//System.out.println(attributes.getValue("person_id"));
if("person".equals(qName)){
person = new Person();
}
// if ("name".equals(qName)){
// tag=qName;
// }else if ("age".equals(qName)){
// tag=qName;
// }
tag = qName;
}
//每一個標簽結束時調用
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if ("person".equals(qName)){
persons.add(person);
}
tag=null;
}
//當解析到標簽中的內容的時候調用(換行也是文本內容)
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
if(tag!=null){
if ("name".equals(tag)){
person.setName(new String(ch,start,length));
}
if ("age".equals(tag)){
person.setAge(new String(ch,start,length));
}
}
}
}
person.xml
<?xml version="1.0" encoding="UTF-8"?>
<persions>
<person>
<name>小明</name>
<age>18</age>
</person>
<person>
<name>小花</name>
<age>17</age>
</person>
</persions>
