关于使用SAX解析xml文件的范例

从事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;//把当前读取的标签清空
}

}


转载于:https://my.oschina.net/u/2563684/blog/550727

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值