sax解析xml案例一

student.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<StudentInfo>
<student>
<name>赵海波</name>
<sex></sex>
<lesson>
<lessonName>Spring整合开发</lessonName>
<lessonScore>85</lessonScore>
</lesson>
<lesson>
<lessonName>轻量级J2EE应用开发</lessonName>
<lessonScore>95</lessonScore>
</lesson>
<lesson>
<lessonName>Ajax应用开发</lessonName>
<lessonScore>80</lessonScore>
</lesson>
</student>
<student>
<name>程卫娜</name>
<sex></sex>
<lesson>
<lessonName>Spring整合开发</lessonName>
<lessonScore>80</lessonScore>
</lesson>
<lesson>
<lessonName>轻量级J2EE应用开发</lessonName>
<lessonScore>85</lessonScore>
</lesson>
<lesson>
<lessonName>Ajax应用开发</lessonName>
<lessonScore>90</lessonScore>
</lesson>
</student>
</StudentInfo>

fuzhou_weather.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 福州的天气情况 -->
<xml_api_reply version="1">
<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1"
row
="0" section="0">
<forecast_information>
<city data="Fuzhou, Fujian" />
<postal_code data="fuzhou" />
<latitude_e6 data="" />
<longitude_e6 data="" />
<forecast_date data="2011-01-08" />
<current_date_time data="2011-01-08 23:00:00 +0000" />
<unit_system data="SI" />
</forecast_information>
<current_conditions>
<condition data="多云" />
<temp_f data="53" />
<temp_c data="12" />
<humidity data="湿度: 43%" />
<icon data="/ig/images/weather/mostly_cloudy.gif" />
<wind_condition data="风向: 东北、风速:1 米/秒" />
</current_conditions>
<forecast_conditions>
<day_of_week data="周六" />
<low data="7" />
<high data="14" />
<icon data="/ig/images/weather/chance_of_rain.gif" />
<condition data="可能有雨" />
</forecast_conditions>
<forecast_conditions>
<day_of_week data="周日" />
<low data="6" />
<high data="12" />
<icon data="/ig/images/weather/chance_of_rain.gif" />
<condition data="可能有雨" />
</forecast_conditions>
<forecast_conditions>
<day_of_week data="周一" />
<low data="5" />
<high data="10" />
<icon data="/ig/images/weather/mostly_sunny.gif" />
<condition data="晴间多云" />
</forecast_conditions>
<forecast_conditions>
<day_of_week data="周二" />
<low data="4" />
<high data="8" />
<icon data="/ig/images/weather/chance_of_rain.gif" />
<condition data="可能有雨" />
</forecast_conditions>
</weather>
</xml_api_reply>

学生Student类

package com.ljq.entity;

import java.util.Set;

/**
* 学生信息表
*
*
@author jiqinlin
*
*/
public class Student {
/** 姓名 * */
private String name;
/** 性别 * */
private String sex;
/** 所学课程 * */
private Set<Lesson> lessons;

public Student() {
}

public Student(String name, String sex, Set<Lesson> lessons) {
this.name = name;
this.sex = sex;
this.lessons = lessons;
}

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 Set<Lesson> getLessons() {
return lessons;
}

public void setLessons(Set<Lesson> lessons) {
this.lessons = lessons;
}

}

课程Lesson类

package com.ljq.entity;

/**
* 课程
*
*
@author jiqinlin
*
*/
public class Lesson {
/** 课程名称 * */
private String lessonName;
/** 课程成绩 * */
private int lessonScore;

public Lesson() {
}

public Lesson(String lessonName, int lessonScore) {
this.lessonName = lessonName;
this.lessonScore = lessonScore;
}

public String getLessonName() {
return lessonName;
}

public void setLessonName(String lessonName) {
this.lessonName = lessonName;
}

public int getLessonScore() {
return lessonScore;
}

public void setLessonScore(int lessonScore) {
this.lessonScore = lessonScore;
}

}

当前天气信息的类Weather

package com.ljq.entity;

import java.util.List;

/**
* 当前天气信息的类
*
*
@author jiqinlin
*
*/
public class Weather {
/** 城市 * */
private String city;
/** 当天日期,格式为yyyy-mm-dd * */
private String forecase_date;
/** 当前时间 * */
private String current_date_time;
/** 现象描述 * */
private String current_condition;
/** 当前干燥程度 * */
private String current_humidity;
/** 当前图片地址 * */
private String current_image_url;
/** 风向 * */
private String current_wind;
/** 此处只能用有序的List集合,因为第一位索引表示当天的天气情况 **/
private List<Forecast> forecasts;

public String getCity() {
return city;
}

public void setCity(String city) {
this.city = city;
}

public String getForecase_date() {
return forecase_date;
}

public void setForecase_date(String forecase_date) {
this.forecase_date = forecase_date;
}

public String getCurrent_date_time() {
return current_date_time;
}

public void setCurrent_date_time(String current_date_time) {
this.current_date_time = current_date_time;
}

public String getCurrent_condition() {
return current_condition;
}

public void setCurrent_condition(String current_condition) {
this.current_condition = current_condition;
}

public String getCurrent_humidity() {
return current_humidity;
}

public void setCurrent_humidity(String current_humidity) {
this.current_humidity = current_humidity;
}

public String getCurrent_image_url() {
return current_image_url;
}

public void setCurrent_image_url(String current_image_url) {
this.current_image_url = current_image_url;
}

public String getCurrent_wind() {
return current_wind;
}

public void setCurrent_wind(String current_wind) {
this.current_wind = current_wind;
}

public List<Forecast> getForecasts() {
return forecasts;
}

public void setForecasts(List<Forecast> forecasts) {
this.forecasts = forecasts;
}

}

未来天气信息的类Forecast

package com.ljq.entity;

/**
* 未来天气信息的类
*
*
@author jiqinlin
*
*/
public class Forecast {
/** 星期几 * */
private String day_of_week;
/** 最低温度 * */
private String low;
/** 最高温度 * */
private String high;
/** 图片地址 * */
private String image_url;
/** 现象描述 * */
private String condition;

public String getDay_of_week() {
return day_of_week;
}

public void setDay_of_week(String day_of_week) {
this.day_of_week = day_of_week;
}

public String getLow() {
return low;
}

public void setLow(String low) {
this.low = low;
}

public String getHigh() {
return high;
}

public void setHigh(String high) {
this.high = high;
}

public String getImage_url() {
return image_url;
}

public void setImage_url(String image_url) {
this.image_url = image_url;
}

public String getCondition() {
return condition;
}

public void setCondition(String condition) {
this.condition = condition;
}

}

StudentSax解析

package com.ljq.sax;

import java.util.HashSet;
import java.util.Set;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.ljq.entity.Lesson;
import com.ljq.entity.Student;

public class StudentSax extends DefaultHandler {
private Lesson lesson;
private Set<Lesson> lessons;
private Student student;
private Set<Student> students;
private String preTag;

@Override
public void startDocument() throws SAXException {
lessons
= new HashSet<Lesson>();
students
= new HashSet<Student>();
}

@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (student != null) {
String data
= new String(ch, start, length);
if ("name".equals(preTag)) {
student.setName(data);
}
if ("sex".equals(preTag)) {
student.setSex(data);
}
if ("lessonName".equals(preTag)) {
lesson.setLessonName(data);
}
if ("lessonScore".equals(preTag)) {
lesson.setLessonScore(Integer.parseInt(data));
}
}
}

@Override
public void startElement(String uri, String localName, String name,
Attributes attr)
throws SAXException {
if ("student".equals(name)) {
student
= new Student();
}
if ("lesson".equals(name)) {
lesson
= new Lesson();
}
preTag
= name;

}

@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
if (student != null && "student".equals(name)) {
student.setLessons(lessons);
students.add(student);
student
= null;
lessons
= new HashSet<Lesson>();
}
if (lesson != null && "lesson".equals(name)) {
lessons.add(lesson);
lesson
= null;
}
preTag
= null;
}

public Set<Student> getStudents() {
return students;
}

public Set<Lesson> getLessons() {
return lessons;
}
}

WeatherSax解析

package com.ljq.sax;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.ljq.entity.Forecast;
import com.ljq.entity.Weather;

public class WeatherSax extends DefaultHandler {
private Weather weather;
private Forecast forecast;
private List<Forecast> forecasts;
private String preTag;

@Override
public void startDocument() throws SAXException {
weather
= new Weather();
forecasts
= new ArrayList<Forecast>();
}

@Override
public void characters(char[] ch, int start, int length)
throws SAXException {

}

@Override
public void startElement(String uri, String localName, String name,
Attributes attr)
throws SAXException {

if ("city".equals(name)) {
weather.setCity(attr.getValue(
"data")); // 等价于weather.setCity(attr.getValue("data"));
}
if ("forecast_date".equals(name)) {
weather.setForecase_date(attr.getValue(
"data"));
}
if ("current_date_time".equals(name)) {
weather.setCurrent_date_time(attr.getValue(
"data"));
}
if("current_conditions".equals(name)){
preTag
= name;
}
if ("condition".equals(name) && "current_conditions".equals(preTag)) {
weather.setCurrent_condition(attr.getValue(
"data"));
}
if ("humidity".equals(name)) {
weather.setCurrent_humidity(attr.getValue(
"data"));
}
if ("icon".equals(name) && "current_conditions".equals(preTag)) {
weather.setCurrent_image_url(attr.getValue(
"data"));
}
if ("wind_condition".equals(name)) {
weather.setCurrent_wind(attr.getValue(
"data"));
}

if ("forecast_conditions".equals(name)) {
preTag
= name; // 记录标识,用来区分相同节点的不同父节点
forecast = new Forecast();
}
if ("day_of_week".equals(name)) {
forecast.setDay_of_week(attr.getValue(
"data"));
}
if ("low".equals(name)) {
forecast.setLow(attr.getValue(
"data"));
}
if ("high".equals(name)) {
forecast.setHigh(attr.getValue(
"data"));
}

if ("icon".equals(name) && "forecast_conditions".equals(preTag)) {
forecast.setImage_url(attr.getValue(
"data"));
}
if ("condition".equals(name) && "forecast_conditions".equals(preTag)) {
forecast.setCondition(attr.getValue(
"data"));
}

}

@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
if ("forecast_conditions".equals(name)) {
forecasts.add(forecast);
forecast
= null;
}
if ("weather".equals(name)) {
weather.setForecasts(forecasts);
}

}

public Weather getWeather() {
return weather;
}
}

StudentSaxTest测试类

package com.ljq.test;

import java.io.InputStream;
import java.util.Set;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import com.ljq.entity.Lesson;
import com.ljq.entity.Student;
import com.ljq.sax.StudentSax;

public class StudentSaxTest {
public static void main(String[] args) throws Exception {
Set
<Student> students = new StudentSaxTest().parseXMLFile();
for(Student stu : students){
System.out.println(
"name=" + stu.getName());
System.out.println(
"sex=" + stu.getSex());
Set
<Lesson> lessons = stu.getLessons();
for(Lesson lesson : lessons){
System.out.println(
"LessonName = " + lesson.getLessonName());
System.out.println(
"LessonScore = " + lesson.getLessonScore());
System.out.println(
"---------------");
}
System.out.println(
"==========");
}
}

// 解析文档
private Set<Student> parseXMLFile() throws Exception {
SAXParserFactory factory
= SAXParserFactory.newInstance();
SAXParser saxParser
= factory.newSAXParser();
InputStream is
= StudentSaxTest.class.getClassLoader()
.getResourceAsStream(
"student.xml");
StudentSax handle
= new StudentSax();
saxParser.parse(is, handle);
is.close();
return handle.getStudents();
}

}

WeatherSaxTest测试类

package com.ljq.test;

import java.io.InputStream;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import com.ljq.entity.Forecast;
import com.ljq.entity.Weather;
import com.ljq.sax.WeatherSax;

public class WeatherSaxTest {

public static void main(String[] args) throws Exception{
Weather weather
= new WeatherSaxTest().readXml();
System.out.println(
"city=" + weather.getCity());
System.out.println(
"forecase_date=" + weather.getForecase_date());
System.out.println(
"current_date_time=" + weather.getCurrent_date_time());
System.out.println(
"condition=" + weather.getCurrent_condition());
System.out.println(
"humidity=" + weather.getCurrent_humidity());
System.out.println(
"icon=" + weather.getCurrent_image_url());
System.out.println(
"wind_condition=" + weather.getCurrent_wind());
System.out.println(
"===========");
List
<Forecast> forecasts = weather.getForecasts();
for(Forecast forecast : forecasts){
System.out.println(
"day_of_week=" + forecast.getDay_of_week());
System.out.println(
"low=" + forecast.getLow());
System.out.println(
"high=" + forecast.getHigh());
System.out.println(
"icon=" + forecast.getImage_url());
System.out.println(
"condition=" + forecast.getCondition());
System.out.println(
"---------------");
}

}

private Weather readXml() throws Exception{
SAXParserFactory factory
= SAXParserFactory.newInstance();
SAXParser parser
= factory.newSAXParser();
InputStream is
= WeatherSaxTest.class.getClassLoader().getResourceAsStream("fuzhou_weather.xml");
WeatherSax handle
= new WeatherSax();
parser.parse(is, handle);
is.close();
return handle.getWeather();
}
}
原文地址:https://www.cnblogs.com/linjiqin/p/1981076.html