XML练习题 -------院线售票系统
题目要求:
一、需要先准备5部上线电影信息,内容包括电影名称、电影内部编号、电影主演、电影导演、电影票价、电影上映日期。(请使用XML进行记录,电影相关信息自行杜撰即可)
二、新建java项目,项目名自定
三、在项目中编写一个实体类,名称自定,实体类的属性要求对应步骤一中的电影信息内容
四、新建一个工具类,工具类中要求编写一个方法,返回带泛型List集合,读取步骤一中的XML全部电影信息
五、新建一个系统类,要求能够打印如下菜单:
六、选择1时,在控制台打印步骤四读取的全部影院信息:
首先先创建一个XML文件
代码如下(示例):
<?xml version="1.0" encoding="UTF-8" ?>
<movies>
<movie>
<name>战狼</name>
<id>1</id>
<performer>吴京</performer>
<director>吴京</director>
<price>35</price>
<date>2015-04-02</date>
</movie>
<movie>
<name>夏洛特烦恼</name>
<id>2</id>
<performer>闫非</performer>
<director>沈腾</director>
<price>40</price>
<date>2015-09-30</date>
</movie>
<movie>
<name>长津湖之水门桥</name>
<id>3</id>
<performer>徐克</performer>
<director>吴京</director>
<price>60</price>
<date>2022-02-01</date>
</movie>
<movie>
<name>这个杀手不太冷静</name>
<id>4</id>
<performer>邢文雄</performer>
<director>魏翔</director>
<price>42</price>
<date>2022-02-01</date>
</movie>
<movie>
<name>奇迹·笨小孩</name>
<id>5</id>
<performer>文牧野</performer>
<director>易烊千玺</director>
<price>26</price>
<date>2022-02-01</date>
</movie>
</movies>
建一个实体类,包含所需的属性
import java.io.Serializable;
/*
实体类
*/
public class Movie implements Serializable {
private String id;//电影编号
private String name;//电影名
private String performer;//导演
private String director; //演员
private double price; //票价
private String date; //放映日期
public Movie(String id, String name, String performer, String director, double price, String date) {
this.id = id;
this.name = name;
this.performer = performer;
this.director = director;
this.price = price;
this.date = date;
}
public void showInfo(){
System.out.println("电影编号:"+id+"\t电影名:"+name+"\t导演:"+performer
+"\t主演:"+director+"\t放映时间:"+date+"\t票价:"+price);
}
public Movie() {
}
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 String getPerformer() {
return performer;
}
public void setPerformer(String performer) {
this.performer = performer;
}
public String getDirector() {
return director;
}
public void setDirector(String director) {
this.director = director;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
建一个工具类,要求编写一个方法,返回带泛型List集合,读取步骤一中的XML全部电影信息
代码如下(示例):
import entity.Movie;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
工具类
*/
public class MoviesUtil {
Document doc=null;
//生成dom树
public void getDom(){
//读取器
SAXReader reader=new SAXReader();
//读取XML文档 获得document对象
try{
doc=reader.read("src/movies.xml");
}catch (DocumentException e){
e.printStackTrace();
}
}
//解析XML文档
public List<Movie> showXML(){
List<Movie> mList=new ArrayList<>(); //所有电影的集合
//获取根节点
Element root=doc.getRootElement();
Iterator<Element> it=root.elementIterator();
while (it.hasNext()){
//获得movie节点的标签元素
Element movieEle=it.next();
Iterator<Element> itMovie=movieEle.elementIterator();
Movie movie=new Movie();
while (itMovie.hasNext()) {
Element ele = itMovie.next();
if (ele.getName().equals("name")) {
String name = ele.getText();
movie.setName(name);
} else if (ele.getName().equals("id")) {
movie.setId(ele.getText());
} else if (ele.getName().equals("performer")) {
movie.setPerformer(ele.getText());
} else if (ele.getName().equals("director")) {
movie.setDirector(ele.getText());
} else if (ele.getName().equals("price")) {
movie.setPrice(Double.parseDouble(ele.getText()));
}else if (ele.getName().equals("date")) {
movie.setDate(ele.getText());
}
}//内循环
mList.add(movie);
}//外循环
return mList;
}
public void showInfo(List<Movie>movies){
System.out.println("编号\t电影名称\t\t\t导演\t主演\t票价\t放映日期");
//遍历
for (Movie movie : movies) {
movie.showInfo();
}
}
}
建一个系统类,对工具类方法进行调用
import entity.Movie;
import util.MoviesUtil;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/*
系统类
*/
public class MoviesMgr {
Scanner input=new Scanner(System.in);
//新建工具类对象
MoviesUtil util=new MoviesUtil();
//所有电影的集合
List<Movie> movies=null;
//所有卖出票的电影的集合
List<Movie> saleMovies=new ArrayList<>();
public void start(){
//调用工具类方法
util.getDom();
do {
System.out.println("---院线在线选票系统---");
System.out.println("1.浏览电影信息");
System.out.println("2.在线选票");
System.out.println("3.查看购买记录");
System.out.println("4.退出系统");
System.out.println("请输入编号:");
int choice=input.nextInt();
switch (choice){
case 1:
System.out.println("---浏览电影信息---");
movies = util.showXML();
//调用输出方法
util.showInfo(movies);
break;
case 2:
System.out.println("---请输入电影编号---");
int no=input.nextInt();
//获取编号的电影对象
Movie movie=movies.get(no-1);
saleMovies.add(movie);
System.out.println("完成购买电影《"+movie.getName()+"》购换卷,可在任意时间观看");
//调用序列化方法
this.save();
break;
case 3:
//System.out.println("---查看购买记录---");
//反序列化
File file=new File("src/film.txt");
if (!file.exists()){
System.out.println("第一次访问,还没有销售记录,无法读取");
return;
}
this.read();
//调用输出方法
util.showInfo(saleMovies);
break;
case 4:
System.out.println("---退出系统---");
System.exit(1);
break;
default:
System.out.println("输入序号错误!");
}
}while (true);
}
public void save(){
//1.创建序列化对象
ObjectOutputStream oos=null;
try{
oos=new ObjectOutputStream(new FileOutputStream("src/film.txt"));
//2.序列化
oos.writeObject(saleMovies);
}catch (Exception ex){
ex.printStackTrace();
}finally {
try {
if (oos!=null){
//3.关闭
oos.close();
}
}catch (Exception ex){
ex.printStackTrace();
}
}
}
//反序列化
public void read(){
//1.创建反序列化对象
ObjectInputStream ois=null;
try{
ois =new ObjectInputStream(new FileInputStream("src/film.txt"));
//2. 反序列化
saleMovies =(List<Movie>)ois.readObject();
}catch (Exception ex){
ex.printStackTrace();
}finally {
try {
if (ois!=null){
//3.关闭
ois.close();
}
}catch (Exception ex){
ex.printStackTrace();
}
}
}
}
最后建一个测试类测试
/*
测试类
*/
public class MoviesTest {
public static void main(String[] args) {
MoviesMgr mgr=new MoviesMgr();
mgr.start();
}
}
总结
以上就是XML文件影院售票系统的内容,本文简单介绍了序列化及反序列化的使用,其中还包含了泛型List集合的使用、document对象、流、等知识点。