XML SAX解析xml檔案
阿新 • • 發佈:2019-02-10
SAX解析xml檔案
一、student.xml(解析的檔案)
<?xml version="1.0" encoding="utf-8" ?><!--xml文件宣告-->
<!--DTD約束-->
<!DOCTYPE class [
<!ELEMENT student (name,age,sex,height)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT height (#PCDATA)>
]>
<!--只能有一個根標籤-->
<class>
<!--設定屬性-->
<student id="1" user="lisi">
<name>李四</name>
<age>18</age>
<sex>男</sex>
<height>182</height>
</student>
<student id="2" user="wangwu">
<name>王五</name>
<age>19</age>
<sex>男</sex>
<height>172</height>
</student>
</class>
二、解析程式碼(SAXParseMain.java)
package com.xml.main;
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.util.ArrayList;
public class SAXParseMain {
public static void main(String[] args) {
try {
//步驟一:建立SAX解析工廠例項
SAXParserFactory factory = SAXParserFactory.newInstance();
//步驟二:通過工廠建立一個SAX解析器
SAXParser sax = factory.newSAXParser();
MyHandler myHandler = new MyHandler();
//步驟三:指定用相應的解析器開始解析XML文件
sax.parse("student.xml", myHandler);
ArrayList<Student> list = myHandler.getList();
for (int i = 0; i < list.size(); i++) {
Student student = list.get(i);
System.out.println(student.toString());
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
}
//指定解析處理器,編寫解析規則
class MyHandler extends DefaultHandler {
ArrayList<Student> list = new ArrayList<>();
public ArrayList<Student> getList() {
return list;
}
private Student student;
private String target = "";
// 解析到文件的開始
@Override
public void startDocument() throws SAXException {
}
// 解析到開始的元素節點(包括根節點)
/**
* @param uri 名稱空間
* @param localName 元素名稱【不支援了】
* @param qName [字首:]元素名稱(沒有名稱空間就不存在字首)
* @param attributes 屬性集
* @throws SAXException 異常
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if ("student".equals(qName)) {
student = new Student();
String id = attributes.getValue("id");
String user = attributes.getValue("user");
student.setId(Integer.parseInt(id));
student.setUser(user);
}
target = qName;
}
/**
* 解析到文字內容(包括回車,空格,換行)
*
* @param ch SAX並不是把整個文件載入到記憶體中,SAX會把解析到的內容快取起來(快取8192位元組),char[] ch就是解析到的快取內容
* @param start 遇到文字的開始字元位置
* @param length 當前整個文字從一個標籤到下一個標籤的長度
* @throws SAXException
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String content = new String(ch, start, length);
switch (target) {
case "name":
student.setName(content);
break;
case "age":
student.setAge(Integer.parseInt(content));
break;
case "sex":
student.setSex(content);
break;
case "height":
student.setHeight(Double.parseDouble(content));
break;
}
}
/**
* 解析到結束的元素節點
*
* @param uri
* @param localName
* @param qName
* @throws SAXException
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("student".equals(qName)) {
list.add(student);
}
target = "";
}
/**
* 解析到文件的結束
*
* @throws SAXException
*/
@Override
public void endDocument() throws SAXException {
}
}
三、Student.java
package com.xml.main;
public class Student {
private int id;
private String user;
private String name;
private String sex;
private int age;
private double height;
public Student() {
}
public Student(int id, String user, String name, String sex, int age, double height) {
this.id = id;
this.user = user;
this.name = name;
this.sex = sex;
this.age = age;
this.height = height;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", user='" + user + '\'' +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", height=" + height +
'}';
}
}
四、解析結果
注:讀邊解析,應用於大型XML文件