学生管理小系统-XML DOM操作的实例小项目

前言

之前试了一下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名字.若是你有什么想法,可以留言,我们一起看看呀~

猜你喜欢

转载自blog.csdn.net/qq_41376740/article/details/80977148