本文共 8573 字,大约阅读时间需要 28 分钟。
要求:使用XML保存图书信息,使用DOM4J操作XML,进行图书的增删改查。
使用技术:XML/DOM4j/集合/对象
部分实现效果如果下:
实现思路
首先需要创建一个图书类(Book类),保存图书的属性(属性和XML文件一致,因为最终修改的是XML文件),将图书对象放到泛型集合里面去,直接操作集合就可以了,因为需要修改XML文件,每一次对图书的操作都需要保存到XML文件中去,所以可以写一个XmlUtil工具类,专门进行文件的读取和存储,将对文件的操作(增删改查)的方法写一个BookMsg类,最后需要一个测试类,所以这个项目整体需要四个类 ——图书类(Book)、XML文件的读取的和存储(XmlUtil)、XML文件的操作(BookMsg)、测试类(BookText)、XML文件
图书类:
根据项目要求赋予属性,创建构造函数
packagecom.book;public classBook {private Integer id; //图书ID
private String name; //图书名字
private String author; //图书作者
private float price; //图书日租金
private int status; //图书状态(0为未借出,1为借出)
private int count; //图书借出次数
private String times; //借出的日期
publicBook() {}public Book(Integer id, String name, String author, float price, int status, intcount, String times) {this.id =id;this.name =name;this.author =author;this.price =price;this.status =status;this.count =count;this.times =times;
}publicInteger getId() {returnid;
}public voidsetId(Integer id) {this.id =id;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}publicString getAuthor() {returnauthor;
}public voidsetAuthor(String author) {this.author =author;
}public floatgetPrice() {returnprice;
}public void setPrice(floatprice) {this.price =price;
}public intgetStatus() {returnstatus;
}public void setStatus(intstatus) {this.status =status;
}public intgetCount() {returncount;
}public void setCount(intcount) {this.count =count;
}publicString getTimes() {returntimes;
}public voidsetTimes(String times) {this.times =times;
}
//重写toStringpublicString toString() {return "Book [id=" + id + ", name=" + name + ", author=" + author + ", price=" + price + ", status=" +status+ ", count=" + count + ", times=" + times + "]";
}
//重写equals方法public booleanequals(Object obj) {
Book ob=(Book) obj;return this.name.equals(ob.getName());
}
}
XML文件
先根据要求初始化一个XML文件
西游记
吴承恩
23
1
45.2
0
红楼梦
曹雪芹
2018-5-16
23
2
68.5
1
白雪公主
迪士尼
37
3
35.8
0
皮皮鸟
zyh
3
4
32.0
0
XmlUtil类
这个类主要实现对XML文件的读取和存储,因为进行操作的时候都需要调用这两个方法,所以可以写为静态方法,而我们读取Xml文件的时候是用集合去保存的,所以读取方法可以返回一个集合,保存XML文件的时候也是保存集合的,所以可以给个集合参数。
难点是我们在BookMsg中写增删改查的方法虽然是用下面写的读取方法qurrybooks()去操作一个集合,但是我们要清楚这个最终修改的是集合里面的每一个Book对象,所以文件的读取保存也是一样,我们要在集合里面的对象和使用DOM4J拿元素的值和创建元素并赋值的方法中切换,实际上是通过了一个集合的转换,将对象的属性和使用DOM4J结合。
packagecom.book;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStreamWriter;importjava.io.UnsupportedEncodingException;importjava.util.ArrayList;importjava.util.List;importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.Element;importorg.dom4j.io.OutputFormat;importorg.dom4j.io.SAXReader;importorg.dom4j.io.XMLWriter;/***
* XML文件读取/保存
**/
public classXmlUtil {/*** 读取XML、返回一个集合*/
public static Listqurrybooks(){//创建一个泛型集合,保存图书
List books = new ArrayList();//DOM4J读取文件
SAXReader reader = newSAXReader();try{
Document doc=reader.read(new File("Book.xml"));
Element root=doc.getRootElement();//将根元素下的所有book元素放到集合eleBooks中去
List eleBooks=root.elements("book");//遍历每一个book元素下的所有元素(相当于每一本书),把XML里面每一个元素都放到一个新的Book对象里面去
for(Element elembook : eleBooks) {
Book b=newBook();
b.setName(elembook.elementText("name"));
b.setAuthor(elembook.elementText("author"));
b.setId(Integer.parseInt(elembook.element("id").getText()));
b.setCount(Integer.parseInt(elembook.element("count").getText()));
b.setPrice(Float.parseFloat(elembook.element("price").getText()));
b.setStatus(Integer.parseInt(elembook.element("status").getText()));
b.setTimes(elembook.elementText("times"));//再把每一个Book对象放到集合中
books.add(b);
}
}catch(DocumentException e) {
e.printStackTrace();
}//返回一个的集合
returnbooks;
}/***保存XML文件,传一个集合,将集合中的Book对象写到XML文件中去*/
public static boolean SaveXML(Listbook) {
SAXReader read=newSAXReader();//创建一个DOC树,因为XML存文件是存储document树
Document doc=read.getDocumentFactory().createDocument();//创建根元素
Element root=doc.addElement("Books");try{//遍历集合中的所有Book对象,将每一个对象中的属性的值拿出来写到对应XML的属性中去
for(Book b : book) {//创建book元素,在book元素下再去创建对象相对于的元素并给元素的文本属性赋值
Element elebook=root.addElement("book");
elebook.addElement("name").setText(b.getName());
elebook.addElement("author").setText(b.getAuthor());
elebook.addElement("times").setText(b.getTimes()==null?"":b.getTimes());
elebook.addElement("count").setText(b.getCount()+"");
elebook.addElement("id").setText(b.getId()+"");
elebook.addElement("price").setText(b.getPrice()+"");
elebook.addElement("status").setText(b.getStatus()+"");
}//DOM4J的写的XMLWriter()方法,前面是路径,后面是按照漂亮格式写出
XMLWriter xmlw = new XMLWriter(new FileOutputStream("book.xml"), OutputFormat.createPrettyPrint());//将doc树写到xml文件中去
xmlw.write(doc);
xmlw.flush();
xmlw.close();
}catch (UnsupportedEncodingException |FileNotFoundException e) {//TODO Auto-generated catch block
e.printStackTrace();
}catch(IOException e) {//TODO Auto-generated catch block
e.printStackTrace();return false;
}return true;
}
}
BookMsg类
图书的 1.查阅图书功能 2.增加图书功能 3.删除图书功能 4.借阅图书功能 5.归还图书功能
packagecom.book;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;public classBookMsg {//将读取到的XML文件返回的集合设置为全局属性,下面所有方法都 可以直接使用集合book
List book=XmlUtil.qurrybooks();/*** 展示所有图书*/
public voidshowInfo() {
System.out.println("编号\t状态\t名称\t借出次数\t借出日期");for(Book b: book) {//如果图书未借出,借出日期 为空的字符串
if(b.getStatus()==0) {
b.setTimes("");
}//输出图书状态
System.out.println(b.getId()+"\t"+(b.getStatus()==0?"未借出":"已借出")+"\t"+b.getName()+"\t"+b.getCount()+"\t"+b.getTimes());
}
}/*** 增加图书,传一个新的Book对象,直接放到book集合里面去,保存到XML文件中*/
public voidaddBook(Book b) {if(book.size()==0) {
b.setId(1);
}else{
b.setId( book.get(book.size()-1).getId() +1);
}
book.add(b);
System.out.println("增加成功!");
XmlUtil.SaveXML(book);
}/*** 删除图书,将需要删除的Book对象传进来,判断集合中是否有这个对象且不为借出状态就可以删除 contains()
* 删除后保存*/
public voiddeleteBook(Book b) {//判断集合中是否有对象b,且该图书为借出状态时不可被删除
if(book.contains(b)&&b.getStatus()!=1) {
book.remove(b);
XmlUtil.SaveXML(book);
System.out.println("删除成功!");
}else{
System.out.println("图书不存在");
}
}/*** 借图书,传进来的Book对象判断一下集合中是否有这本书,要重写 equles方法,存在就修改状态并且改上当前借出时间
*@paramb*/
public voidborrowBook(Book b) {//转换器,设置格式
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");//创建现在的时间
Date nowdate=newDate();//将现在的时间转为字符串
String nowtime=format.format(nowdate);boolean f=false;for(Book book2 : book) {if(book2.getName().equals(b.getName())&&book2.getStatus()==0) {
f=true;
book2.setStatus(1);
book2.setTimes(nowtime);
XmlUtil.SaveXML(book);
System.out.println("借阅成功!");
}
}if(!f) {
System.out.println("图书不存在或已被借阅");
}
}/*** 归还图书,传进来的Book对象判断一下集合中是否有这本书借出,并修改相对应的属性*/
public voidreturnBook(Book b) {
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");boolean f=false;for(Book book2 : book) {if(book2.getName().equals(b.getName())&&book2.getStatus()==1) {
f=true;try{
Date nowdate=newDate();
String nowtime=format.format(nowdate);//将借出 的时间转换成Date类型 进行计算
Date olddate=format.parse(book2.getTimes());//计算借出的天数
int date=(int)((nowdate.getTime()-olddate.getTime())/1000/3600/24);
book2.setStatus(0);
book2.setCount(book2.getCount()+1);
XmlUtil.SaveXML(book);
System.out.println("归还成功!");
System.out.println("借出日期为:"+book2.getTimes());
System.out.println("归还日期为:"+nowtime);
System.out.println("应付租金为:"+book2.getPrice()*date);
}catch(ParseException e) {
e.printStackTrace();
}
}
}if(!f) {
System.out.println("图书不存在或已归还");
}
}
}
Bookmain类
packagecom.book;importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;public classBookmain {public static voidmain(String[] args) {
Scanner input=newScanner(System.in);
BookMsg bsg=newBookMsg();int type=0;do{
System.out.println("********************欢迎来到图书馆********************");
System.out.println("1.查阅图书");
System.out.println("2.增加图书");
System.out.println("3.删除图书");
System.out.println("4.借阅图书");
System.out.println("5.归还图书");
System.out.println("6.退出系统");
type=input.nextInt();switch(type) {case 1:
bsg.showInfo();break;case 2:
Book book=newBook();
System.out.println("请输入图书名字");
book.setName(input.next());
System.out.println("请输入图书作者");
book.setAuthor(input.next());
System.out.println("请输入图书价格");
book.setPrice(input.nextFloat());
bsg.addBook(book);break;case 3:
Book b=newBook();
System.out.println("请输入要删除的图书名字");
b.setName(input.next());
bsg.deleteBook(b);break;case 4:
System.out.println("请输入要借阅的图书");
Book b2=newBook();
b2.setName(input.next());
bsg.borrowBook(b2);break;case 5:
System.out.println("请输入要归还的图书");
Book b3=newBook();
b3.setName(input.next());
bsg.returnBook(b3);break;case 6:
System.out.println("系统结束");return;
}
System.out.println("输入0返回:");
type=input.nextInt();
}while(type==0);
}
}
每一次进行图书的操作(增删改查)的时候,都需要对XML文件进行修改,XmlUtil类 的存在就是为了简化操作的时候每个方法还需要再写一遍对XML文件的读取和写出,而且通过集合的转换也简化了许多操作
转载地址:http://pcyzo.baihongyu.com/