前言
之前试了一下XML DOM操作,现在到了实际应用,自己写还是挺坎坷的,看看代码把
层次图
- dao Data Access Object 数据访问对象, 主要是访问数据用的
- domain 是model层,封装student类
- view 是视图层,和用户打交道的
- utils 是工具层,给dao层提供获得document对象,和写入xml文件的功能
看上去好像初步有了mvc模型,大体流程是这样的.
用户在视图层调用view中的代码,比如查看的操作先发送给dao层,dao层从xml文件中读取数据,封装成Student模型,然后返回给用户,用户从模型中读取响应的数据,相对于增删改操作,用户不需要获得数据,就不需要经过Student模型,直接通过view操作dao层就行了.
设计顺序及代码
先是Student层
package domain;
public class Student {
private String idcard;
private String examid;
private String name;
private String location;
private int grade;
public String getIdcard() {
return idcard;
}
public void setIdcard(String idcard) {
this.idcard = idcard;
}
public String getExamid() {
return examid;
}
public void setExamid(String examid) {
this.examid = examid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
@Override
public String toString() {
return "Student{" +
"idcard='" + idcard + '\'' +
", examid='" + examid + '\'' +
", name='" + name + '\'' +
", location='" + location + '\'' +
", grade=" + grade +
'}';
}
}
下面是dao层
package dao;
import domain.Student;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import utils.XmlUtils;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import java.io.IOException;
/**
* <student idcard="111" examid="222">
* <name>张三</name>
* <location>沈阳</location>
* <grade>89</grade>
* </student>
*/
public class StudentDao {
public void add(Student student) {
try {
Document document = XmlUtils.getDocument();
Element student_element = document.createElement("student");
student_element.setAttribute("idcard", student.getIdcard());
student_element.setAttribute("examid", student.getExamid());
Element name_element = document.createElement("name");
name_element.setTextContent(student.getName());
Element location_element = document.createElement("location");
location_element.setTextContent(student.getLocation());
Element grade_element = document.createElement("grade");
grade_element.setTextContent(String.valueOf(student.getGrade()));
student_element.appendChild(name_element);
student_element.appendChild(location_element);
student_element.appendChild(grade_element);
document.getElementsByTagName("exam").item(0).appendChild(student_element);
XmlUtils.write2Xml(document);
} catch (ParserConfigurationException | IOException | SAXException | TransformerException e) {
throw new RuntimeException(e);
}
}
public Student find(String examid) {
try {
Document document = XmlUtils.getDocument();
NodeList list = document.getElementsByTagName("student");
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element tmp = (Element) node;
if (tmp.getAttribute("examid").equals(examid)) {
return getStudent(tmp);
}
}
}
} catch (ParserConfigurationException | IOException | SAXException e) {
e.printStackTrace();
}
return null;
}
public void delete(String name) {
try {
Document document = XmlUtils.getDocument();
NodeList list = document.getElementsByTagName("student");
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element tmp = (Element) node;
if (tmp.getElementsByTagName("name").item(0).getTextContent().equals(name)) {
tmp.getParentNode().removeChild(tmp);
XmlUtils.write2Xml(document);
System.out.println("操作成功");
return;
}
}
}
System.out.println("删除学生失败,学生不存在");
} catch (ParserConfigurationException | IOException | SAXException | TransformerException e) {
e.printStackTrace();
}
}
private Student getStudent(Element which) {
if (which == null) {
return null;
}
Student student = new Student();
String idcard = which.getAttribute("idcard");
String examid = which.getAttribute("examid");
String name = which.getElementsByTagName("name").item(0).getTextContent();
String location = which.getElementsByTagName("location").item(0).getTextContent();
String grade = which.getElementsByTagName("grade").item(0).getTextContent();
student.setName(name);
student.setLocation(location);
student.setIdcard(idcard);
if (grade != null) {
student.setGrade(Integer.parseInt(grade));
}
student.setExamid(examid);
return student;
}
}
下面是工具层
package utils;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.IOException;
public class XmlUtils {
public static Document getDocument() throws ParserConfigurationException, IOException, SAXException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
return builder.parse(new File("src/student.xml"));
}
public static void write2Xml(Document document) throws TransformerException {
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new DOMSource(document), new StreamResult(new File("src/student.xml")));
}
}
视图view
package view;
import dao.StudentDao;
import domain.Student;
import java.util.Scanner;
/**
* <exam>
* <student idcard="111" examid="222">
* <name>张三</name>
* <location>沈阳</location>
* <grade>89</grade>
* </student>
* </exam>
*/
public class Main {
public static void main(String[] args) {
System.out.println("添加学生(a) 查找学生(b) 删除学生(c)");
System.out.println("输入操作的类型");
Scanner in = new Scanner(System.in);
String type = in.nextLine();
StudentDao dao = new StudentDao();
if (type.equalsIgnoreCase("a")) {
System.out.println("请输入学生姓名");
String name = in.nextLine();
System.out.println("请输入学生的学号");
String idcard = in.nextLine();
System.out.println("请输入学生的考试号");
String examid = in.nextLine();
System.out.println("请输入学生的成绩");
String grade = in.nextLine();
System.out.println("请输入学生的所在城市");
String location = in.nextLine();
Student student = new Student();
student.setExamid(examid);
student.setGrade(Integer.parseInt(grade));
student.setIdcard(idcard);
student.setLocation(location);
student.setName(name);
dao.add(student);
} else if (type.equalsIgnoreCase("b")) {
System.out.println("请输入学生的考试号");
String examid = in.nextLine();
Student student = dao.find(examid);
if (student == null) {
System.out.println("学生未找到");
} else {
System.out.println(student.toString());
}
} else if (type.equalsIgnoreCase("c")) {
System.out.println("请输入学生的名字");
String name = in.nextLine();
dao.delete(name);
}
}
}
结果
初始xml文件:
增加操作:
查找操作:
删除操作:
总结
算是自己的第一个java小项目把,实现的是xml的操作,写这些代码 用了得2个多小时把,从写完了之后,加入自己的想法,然后再整改代码,自己有一个思路,是在delete中使用find,但是问题出现的是document不一致,想到了用一个容器临时存入find中的document,来保证delete和find中的一致性,最后取得了成功,但是总感觉不太好.就换成了delete名字.若是你有什么想法,可以留言,我们一起看看呀~