从事java工作已经一年了,还是属于菜鸟级别,今天就分享一个SAX解析xml文件的范例吧,希望各位大神指点.
第一步:建立SAX解析的主程序
package demo;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.junit.Test;
import org.xml.sax.XMLReader;
public class App {
// SAX解析过程
@Test
public void testApp() throws Exception {
//1. 创建解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//2. 通过工厂,获取解析器
SAXParser parser = factory.newSAXParser();
//3. 通过解析器,获取读取器,读取xml
XMLReader reader = parser.getXMLReader();
//4. 通过读取器,设置内容事件处理器
SaxContentHandler sax = new SaxContentHandler();
reader.setContentHandler(sax);
//5. 指定读取文件的路径
reader.parse("src/student.xml");
// 获取处理好的数据
List<Student> list = sax.getStudentList();
System.out.println(list);
}
}
第二步:建立一个xml文件,输入内容
<?xml version="1.0" encoding="UTF-8"?>
<xml-body>
<student id="A100">
<name>小红</name>
<age>18</age>
<gender>女</gender>
<address>广州天河骏景花园</address>
</student>
<student id="A101">
<name>小明</name>
<age>17</age>
<gender>男</gender>
<address>广州天河华景新城</address>
</student>
<student id="A102">
<name>Test</name>
<age>20</age>
<gender>男</gender>
<address>广州</address>
</student>
<student id="A102">
<name>Rose</name>
<age>20</age>
<gender>女</gender>
<address>广州天河</address>
</student>
</xml-body>
第三步:建立一个student对象
package demo;
// 实体类,封装数据
public class Student {
private String id;
private String name;
private int age;
private char gender;
private String address;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student [address=" + address + ", age=" + age + ", gender="
+ gender + ", id=" + id + ", name=" + name + "]";
}
}
第四步:创建SAX解析事件处理器类
package demo;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* sax解析事件处理器类:
* 作用:
* 解析器解析xml文档的时候,会把解析的内容传入事件处理器(读开始标签、内容、结束标签)方法
*
* 案例3: 获取Student的集合! List<Student>
*
*/
public class SaxContentHandler extends DefaultHandler {
// 返回的封装好的list集合
private List<Student> list = new ArrayList<Student>();
public List<Student> getStudentList(){
return list;
}
// 保存每次读取student节点时候,封装的对象
private Student student;
// 保存每次读取的开始标签名称
private String currentTag;
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// 保存每一个开始标签名称
this.currentTag = qName;
//1. 每次读取student开始标签的时候,创建对象
if ("student".equals(qName)) {
// 创建对象
student = new Student();
// 读取id属性, 设置到对象中
for (int i=0; i<attributes.getLength(); i++) {
// 属性名称
String attr_name = attributes.getQName(i);
// 属性值
String attr_value = attributes.getValue(i);
// 判断
if ("id".equals(attr_name)) {
student.setId(attr_value); // 设置id
break;
}
}
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//2. 封装对象
String str = new String(ch,start,length);
// 当读取的开始标签是name的时候,封装
if ("name".equals(currentTag)){
student.setName(str);
}
// 当读取的开始标签是gender的时候,封装
else if ("gender".equals(currentTag)) {
student.setGender(str.charAt(0));
}
// 当读取的开始标签是address的时候,封装
else if ("address".equals(currentTag)) {
student.setAddress(str);
}
// 当读取的开始标签是age的时候,封装
else if ("age".equals(currentTag)) {
student.setAge(Integer.parseInt(str));
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
//3. 如果结束标签是student,就表示一个xml student节点封装好; 加入list集合
if ("student".equals(qName)) {
// 读取每一个student结束标签
list.add(student);
// 清空对象
student = null; // 建议gc快速回收资源
}
this.currentTag = null;//把当前读取的标签清空
}
}