XML之使用dom4j操作xml中的学生信息(学生信息管理系统)


简介:

使用xml记录学生的各个信息,并实现添加、删除、查询等操作;

 同样需要导入相应的包,详情参见:

下面进行添加的操作实现:

新建xml:

<?xml version="1.0" encoding="UTF-8"?>
<student> 
  <person> 
    <id>001id>  
    <name>zsname>  
    <sex>nansex>  
    <age>11age>  
    <class>1001class> 
  person>  
  <person> 
    <id>002id>  
    <name>lsname>  
    <sex>nansex>  
    <age>12age>  
    <class>1002class> 
  person>  
  <person> 
    <id>003id>  
    <name>wwname>  
    <sex>nvsex>  
    <age>15age>  
    <class>1011class> 
  person> 
student>

工具类:

package dom4jUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
import java.util.Scanner;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public final class Dom4jUtils {
    public static final String PATH = "src" + File.separator + "student" + File.separator + "student.xml";
    /**
     * 将xml的回写操作封装为一个方法
     * 
     * @param xmlPath:xml的路径
     * @param doc:回写操作前修改数据后的Document对象
     */
    public static void ReWriteXml(Document doc) {
        try {
            // 缩进文本
            OutputFormat format = OutputFormat.createPrettyPrint();
            // 创建写入流
            XMLWriter Writer = new XMLWriter(new FileOutputStream(PATH), format);
            Writer.write(doc);
            Writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 将创建解析器和解析xml的步骤封装为一个方法
     * 
     * @param path xml文件的路径
     * @return
     */
    public static Document getDocument() {
        try {
            // 创建解析器
            SAXReader reader = new SAXReader();
            // 解析xml得到Document
            Document doc = reader.read(PATH);
            return doc;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
}

学生信息操作类:

package student;
import java.util.List;
import java.util.Scanner;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import dom4jUtils.Dom4jUtils;

public class StudentManager {

    // 增加学生信息
    @SuppressWarnings("unchecked")
    public void addStudent() {
        Scanner sc = new Scanner(System.in);
        // 得到解析后的doc对象
        Document doc = Dom4jUtils.getDocument();

        // 得到xml根节点
        Element rootElement = doc.getRootElement();

        // 将新建的person节点添加到根节点列表
        Element person = rootElement.addElement("person");
        // 向新建的person列表中添加元素标签
        Element id = person.addElement("id");
        Element name = person.addElement("name");
        Element sex = person.addElement("sex");
        Element age = person.addElement("age");
        Element clazz = person.addElement("class");

        // 设置新建学生信息标签的文本内容
        System.out.print("请输入id:");
        String inputId = sc.next();
        id.setText(inputId);
        System.out.print("请输入name:");
        String inputName = sc.next();
        name.setText(inputName);
        System.out.print("请输入sex:");
        String inputSex = sc.next();
        sex.setText(inputSex);
        System.out.print("请输入age:");
        String inputAge = sc.next();
        age.setText(inputAge);
        System.out.print("请输入class:");
        String inputClazz = sc.next();
        clazz.setText(inputClazz);

        // 回写
        Dom4jUtils.ReWriteXml(doc);
        
        // 关闭流
        sc.close();
        System.out.println("ok!");

    }
    // 删除学生信息

    // 查询学生信息
}

测试类:

package student;

public class Test {
    public static void main(String[] args) {
        StudentManager sm = new StudentManager();
        sm.addStudent();
    }
}

运行结果:

 

添加后的xml信息:

<?xml version="1.0" encoding="UTF-8"?>
<student> 
  <person> 
    <id>001id>  
    <name>zsname>  
    <sex>nansex>  
    <age>11age>  
    <class>1001class> 
  person>  
  <person> 
    <id>002id>  
    <name>lsname>  
    <sex>nansex>  
    <age>12age>  
    <class>1002class> 
  person>  
  <person> 
    <id>003id>  
    <name>wwname>  
    <sex>nvsex>  
    <age>15age>  
    <class>1011class> 
  person>  
  <person>
    <id>005id>
    <name>uuname>
    <sex>nvsex>
    <age>17age>
    <class>1004class>
  person>
student>

 这样就实现了从键盘录入并添加进xml文档的操作。

实现添加、删除、查询等操作:

package student;
import java.util.List;
import java.util.Scanner;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import dom4jUtils.Dom4jUtils;

public class StudentManager {

    // 增加学生信息
    @SuppressWarnings("unchecked")
    public void addStudent() {
        Scanner sc = new Scanner(System.in);
        // 得到解析后的doc对象
        Document doc = Dom4jUtils.getDocument();

        // 得到xml根节点
        Element rootElement = doc.getRootElement();

        // 将新建的person节点添加到根节点列表
        Element person = rootElement.addElement("person");
        // 向新建的person列表中添加元素标签
        Element id = person.addElement("id");
        Element name = person.addElement("name");
        Element sex = person.addElement("sex");
        Element age = person.addElement("age");
        Element clazz = person.addElement("class");

        // 设置新建学生信息标签的文本内容
        System.out.print("请输入id:");
        String inputId = sc.next();
        id.setText(inputId);
        System.out.print("请输入name:");
        String inputName = sc.next();
        name.setText(inputName);
        System.out.print("请输入sex:");
        String inputSex = sc.next();
        sex.setText(inputSex);
        System.out.print("请输入age:");
        String inputAge = sc.next();
        age.setText(inputAge);
        System.out.print("请输入class:");
        String inputClazz = sc.next();
        clazz.setText(inputClazz);

        // 回写
        Dom4jUtils.ReWriteXml(doc);

        // 关闭流
        sc.close();
        System.out.println("ok!");

    }

    // 删除学生信息
    @SuppressWarnings("unchecked")
    public boolean removeStudentMessage() {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入删除学生的id:");
        String msg = sc.next();
        // 得到解析后的doc对象
        Document doc = Dom4jUtils.getDocument();
        // 得到根节点
        Element rootElement = doc.getRootElement();
        // 得到根节点下一级节点列表
        List lists = rootElement.elements();
        // 遍历列表中的节点
        for (Element element : lists) {
            // 得到下的
            Element id = element.element("id");
            // 如果id为001则删除
            if (msg.equals(id.getData())) {
                boolean remove = rootElement.remove(element);
                Dom4jUtils.ReWriteXml(doc);
                return remove;
            }
        }
        return false;
    }

    /**
     * 查询学生信息
     * @return    对应的学生信息
     */
    public String checkStudentMessage() {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入查询学生的id:");
        String stuId = sc.next();
        
        // 得到解析后的doc对象
        Document doc = Dom4jUtils.getDocument();
        // 得到根节点
        Element rootElement = doc.getRootElement();
        // 根节点下节点的列表
        List persons = rootElement.elements();
        for (Element element : persons) {
//            System.out.println(element.elementText("id"));
            // 遍历每一个标签,然后获取其下的标签
            Element id = element.element("id");
            if (stuId.equals(id.getText())) {    // 如果id匹配
                // 调用基本信息查询选项方法
                return choose(element,sc);
            }
        }
        System.out.println("Have no id!Please re-enter!!!");
        // 当id不存在则递归调用重新输入
        return checkStudentMessage();
    }
    /**
     * id存在时查询学生基本信息
     * @param element 当前id的标签
     * @param sc 输入对象
     * @return    对应学生信息
     */
    public String choose(Element element,Scanner sc) {
        System.out.println("**************** 查询信息 ****************");
        System.out.println("1、学生姓名\n2、学生性别\n3、学生年龄\n4、学生班级");
        System.out.print("请输入查询的信息:");
        String input = sc.next();
        switch (input) {    // 选项
        case "1":
            // 名称信息
            return element.element("name").getText();
        case "2":
            // 性别信息
            return element.element("sex").getText();
        case "3":
            // 年龄信息
            return element.element("age").getText();
        case "4":
            // 班级信息
            return element.element("class").getText();
        }
        try {
            // 提示信息
            System.err.println("\nError!Please input number 1-4!!!");
            Thread.currentThread().sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 如果输入的不是1-4则递归调用重新输入
        return choose(element,sc);
    }
}

主类:

package student;
public class Test {
    public static void main(String[] args) {
        StudentManager sm = new StudentManager();
                System.out.println(sm.checkStudentMessage());
    }
}
        

输出结果:

请输入查询学生的id:2
Have no id!Please re-enter!!!
请输入查询学生的id:3
Have no id!Please re-enter!!!
请输入查询学生的id:4
Have no id!Please re-enter!!!
请输入查询学生的id:5
Have no id!Please re-enter!!!
请输入查询学生的id:1
Have no id!Please re-enter!!!
请输入查询学生的id:001
**************** 查询信息 ****************
1、学生姓名
2、学生性别
3、学生年龄
4、学生班级
请输入查询的信息:5

Error!Please input number 1-4!!!
**************** 查询信息 ****************
1、学生姓名
2、学生性别
3、学生年龄
4、学生班级
请输入查询的信息:6

Error!Please input number 1-4!!!
**************** 查询信息 ****************
1、学生姓名
2、学生性别
3、学生年龄
4、学生班级
请输入查询的信息:1
zs

使用XPath的操作:

学生类:

package studentUtils;
import java.util.Objects;
public class Student {
    private String id;
    private String name;
    private String sex;
    private String age;
    private String clazz;
    
    public Student() {}
    public Student(String id,String name,String sex,String age,String clazz) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.clazz = clazz;
    }
    /**
     * @return id
     */
    public String getId() {
        return id;
    }
    /**
     * @param id 要设置的 id
     */
    public void setId(String id) {
        this.id = id;
    }
    /**
     * @return name
     */
    public String getName() {
        return name;
    }
    /**
     * @param name 要设置的 name
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @return sex
     */
    public String getSex() {
        return sex;
    }
    /**
     * @param sex 要设置的 sex
     */
    public void setSex(String sex) {
        this.sex = sex;
    }
    /**
     * @return age
     */
    public String getAge() {
        return age;
    }
    /**
     * @param age 要设置的 age
     */
    public void setAge(String age) {
        this.age = age;
    }
    /**
     * @return clazz
     */
    public String getClazz() {
        return clazz;
    }
    /**
     * @param clazz 要设置的 clazz
     */
    public void setClazz(String clazz) {
        this.clazz = clazz;
    }
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + ", clazz=" + clazz + "]";
    }
    @Override
    public int hashCode() {
        return Objects.hash(age, clazz, id, name, sex);
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        return Objects.equals(age, other.age) && Objects.equals(clazz, other.clazz) && Objects.equals(id, other.id)
                && Objects.equals(name, other.name) && Objects.equals(sex, other.sex);
    }
    
}

操作类接口:

package studentUtils;
public interface IModify {
    boolean addMsg();
    boolean deleteMsg();
    boolean checkMsg();
}

学生信息操作类

package studentUtils;
import java.io.FileOutputStream;
import java.util.List;
import java.util.Scanner;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class ModifyMsg implements IModify {
    private Scanner sc = new Scanner(System.in);

    /**
     * 添加学生基本信息
     * 
     * @return 是否添加成功
     */
    @SuppressWarnings({ "unchecked", "resource" })
    public boolean addMsg() {
        Student student = new Student(); // 新建添加的student对象
        boolean flag = true; // 控制器
        try {
            // 创建解析器
            SAXReader reader = new SAXReader();
            // 解析xml得到doc对象
            Document doc = reader.read("src/studentUtils/student.xml");

            // 得到根节点
            Element rootElement = doc.getRootElement();
            // 新建标签
            Element newPerson = rootElement.addElement("person");
            // 获取所有的节点
            List allId = doc.selectNodes("//id");

            // 对信息赋值
            System.out.print("\nPlease add the id:");
            String inputId = sc.next(); // 输入添加的id
            for (Element element : allId) { //进行遍历
                if (element.getText().equals(inputId)) { // 如果id重复了则重新输入
                    System.out.println("\nThe id exist!Please re-enter!\n");
                    System.out.println("** Continue to addMsg()?");
                    System.out.println("** 1、yes\n** 2、no");
                    System.out.print("** Input your choice: ");
                    int conSc = sc.nextInt(); // id存在,选择是否继续输入
                    if (conSc == 1) {
                        flag = addMsg();
                    } else if (conSc == 2) {
                        flag = false;
                    } else {
                        System.out.println("\nInput 1 or 2!");
                        flag = addMsg();
                    }
                    return flag;
                }
            }
            student.setId(inputId);
            System.out.print("Please add the name:");
            student.setName(sc.next());
            System.out.print("Please add the sex:");
            student.setSex(sc.next());
            System.out.print("Please add the age:");
            student.setAge(sc.next());
            System.out.print("Please add the class:");
            student.setClazz(sc.next());

            // 新建信息标签并赋值
            newPerson.addElement("id").setText(student.getId());
            newPerson.addElement("name").setText(student.getName());
            newPerson.addElement("sex").setText(student.getSex());
            newPerson.addElement("age").setText(student.getAge());
            newPerson.addElement("class").setText(student.getClazz());

            // 回写xml文档
            // 缩进文本
            OutputFormat format = OutputFormat.createPrettyPrint();
            XMLWriter writer = new XMLWriter(new FileOutputStream("src/studentUtils/student.xml"), format);
            writer.write(doc);
            // 是否继续
            if (flag) {
                System.out.println("\n*** Continue to addMsg()?");
                System.out.println("*** 1、yes\n*** 2、no");
                System.out.print("*** Input your choise: ");
                int addChoice = sc.nextInt(); // 输入是否继续添加
                if (addChoice == 1) {
                    flag = addMsg();
                } else if (addChoice == 2) {
                    System.out.println("添加结束\n");
                    flag = false;
                } else if (addChoice != 1 && addChoice != 2) {
                    System.out.println("Input 1 or 2!");
                    flag = addMsg();
                }
            }
            writer.close();
            return flag;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 删除学生信息
     * 
     * @return 是否删除
     */
    @SuppressWarnings("unchecked")
    public boolean deleteMsg() {
        try {
            // 创建解析器
            SAXReader reader = new SAXReader();
            // 解析xml
            Document doc = reader.read("src/studentUtils/student.xml");
            // 获取每一个学生单位
            List persons = doc.selectNodes("//person");
//            System.out.println(persons.size());
            if (persons.size() > 0) {
                // 获取所有id列表

                List idList = doc.selectNodes("//id");
                // 获取所有name列表
                List nameList = doc.selectNodes("//name");

                // 接收删除结果
                boolean flag = choose(idList, nameList, sc);
                // 回写
                // 缩进格式化
                OutputFormat format = OutputFormat.createPrettyPrint();
                XMLWriter writer = new XMLWriter(new FileOutputStream("src/studentUtils/student.xml"), format);
                writer.write(doc);
                // 是否继续
                if (flag) {
                    System.out.println("\nHave " + persons.size() + " Element!");
                    System.out.println("\n*** Continue to deleteMsg()?");
                    System.out.println("*** 1、yes\n*** 2、no");
                    System.out.print("*** Input your choise: ");
                    int deleteChoice = sc.nextInt(); // 输入是否继续删除
                    if (deleteChoice == 1) {
                        flag = deleteMsg();
                    } else if (deleteChoice == 2) {
                        flag = false;
                    } else if (deleteChoice != 1 && deleteChoice != 2) {
                        System.out.println("\nInput 1 or 2!");
                        flag = deleteMsg();
                    }
                }
                writer.close();
                return flag;
            } else {
                // 列表为空:没有person标签
                System.out.println("The Document is null!Please to addMsg()!!!");
                System.out.println("*** Do you want to addMsg()?");
                System.out.println("*** 1、yes\n*** 2、no");
                System.out.print("*** Input your choice: ");
                int useAddMsg = sc.nextInt(); // 列表为空,输入是否去添加元素
                if (useAddMsg == 1) {
                    addMsg();
                } else if (useAddMsg == 2) {
                    System.out.println("Byebye!!!");
                } else if (useAddMsg != 1 && useAddMsg != 2) {
                    System.out.println("\nInput 1 or 2!");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    @SuppressWarnings("resource")
    private boolean choose(List idList, List nameList, Scanner deleteSc) throws Exception {
        boolean flag = false; // 控制输出语句
        if (!flag) {
            System.out.print("\n** Please delete id:");
            String deleteId = deleteSc.next(); // 输入删除的id
            for (Element ele : idList) {
                if (ele.getText().equals(deleteId)) { // 找到相同id
                    flag = ele.getParent().getParent().remove(ele.getParent()); // 的上两级节点删除上一级节点
                    System.out.println("已删除id = " + deleteId + " 的元素");
                    System.out.println(flag);
                    return flag;
                }
            }
            if (!flag) {
                // 重新选择id
                System.out.println("No this id!\n");
                flag = choose(idList, nameList, deleteSc); // 输入删除的name
            }
        }
        return false;
    }
    
    /**
     * 查询学生信息
     */
    public boolean checkMsg() {
        try {
            // 创建解析器
            SAXReader reader = new SAXReader();
            // 解析xml得到doc
            Document doc = reader.read("src/studentUtils/student.xml");
            // 获取标签
            List persons = doc.selectNodes("//person");
            for (Element ele : persons) {
                List elements = ele.elements();
                System.out.println("<" + ele.getName() + ">");
                for (Element eles : elements) {
                    System.out.println("\t" + "<" + eles.getName() + ">" + "" + eles.getText() + "");
                }
                System.out.println("");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
}

 工厂类:

package studentUtils;
public class Factory {
    public static IModify getInstance() {
        return new ModifyMsg();
    }
}

主类:

package studentUtils;

public class Test {
    public static void main(String[] args) {
        IModify mf = Factory.getInstance();
//        mf.addMsg();
//        mf.deleteMsg();
        mf.checkMsg();
    }
}

输出结果:


	1
	1
	1
	1
	1


	3
	3
	3
	3
	3


	5
	5
	5
	5
	5


	4
	4
	4
	4
	4

操作结束。