随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。

 

简介:

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

 同样需要导入相应的包,详情参见:https://www.cnblogs.com/0099-ymsml/p/16062244.html

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

新建xml:

<?xml version="1.0" encoding="UTF-8"?>
<student> 
  <person> 
    <id>001</id>  
    <name>zs</name>  
    <sex>nan</sex>  
    <age>11</age>  
    <class>1001</class> 
  </person>  
  <person> 
    <id>002</id>  
    <name>ls</name>  
    <sex>nan</sex>  
    <age>12</age>  
    <class>1002</class> 
  </person>  
  <person> 
    <id>003</id>  
    <name>ww</name>  
    <sex>nv</sex>  
    <age>15</age>  
    <class>1011</class> 
  </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>001</id>  
    <name>zs</name>  
    <sex>nan</sex>  
    <age>11</age>  
    <class>1001</class> 
  </person>  
  <person> 
    <id>002</id>  
    <name>ls</name>  
    <sex>nan</sex>  
    <age>12</age>  
    <class>1002</class> 
  </person>  
  <person> 
    <id>003</id>  
    <name>ww</name>  
    <sex>nv</sex>  
    <age>15</age>  
    <class>1011</class> 
  </person>  
  <person>
    <id>005</id>
    <name>uu</name>
    <sex>nv</sex>
    <age>17</age>
    <class>1004</class>
  </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();
        // 得到根节点下一级<person>节点列表
        List<Element> lists = rootElement.elements();
        // 遍历列表中的<person>节点
        for (Element element : lists) {
            // 得到<person>下的<id>
            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();
        // 根节点下<person>节点的列表
        List<Element> persons = rootElement.elements();
        for (Element element : persons) {
//            System.out.println(element.elementText("id"));
            // 遍历每一个<person>标签,然后获取其下的<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的<person>标签
     * @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();
            // 新建<person>标签
            Element newPerson = rootElement.addElement("person");
            // 获取所有的<id>节点
            List<Element> allId = doc.selectNodes("//id");

            // 对信息赋值
            System.out.print("\nPlease add the id:");
            String inputId = sc.next(); // 输入添加的id
            for (Element element : allId) { // 对<id>进行遍历
                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");
            // 获取每一个<person>学生单位
            List<Element> persons = doc.selectNodes("//person");
//            System.out.println(persons.size());
            if (persons.size() > 0) {
                // 获取所有id列表

                List<Element> idList = doc.selectNodes("//id");
                // 获取所有name列表
                List<Element> 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>列表为空:没有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<Element> idList, List<Element> 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()); // <id>的上两级节点<student>删除上一级节点<person>
                    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");
            // 获取<person>标签
            List<Element> persons = doc.selectNodes("//person");
            for (Element ele : persons) {
                List<Element> elements = ele.elements();
                System.out.println("<" + ele.getName() + ">");
                for (Element eles : elements) {
                    System.out.println("\t" + "<" + eles.getName() + ">" + "" + eles.getText() + "</" + eles.getName() + ">");
                }
                System.out.println("</" + ele.getName() + ">");
            }
        } 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();
    }
}

输出结果:

<person>
	<id>1</id>
	<name>1</name>
	<sex>1</sex>
	<age>1</age>
	<class>1</class>
</person>
<person>
	<id>3</id>
	<name>3</name>
	<sex>3</sex>
	<age>3</age>
	<class>3</class>
</person>
<person>
	<id>5</id>
	<name>5</name>
	<sex>5</sex>
	<age>5</age>
	<class>5</class>
</person>
<person>
	<id>4</id>
	<name>4</name>
	<sex>4</sex>
	<age>4</age>
	<class>4</class>
</person>

操作结束。

posted on 2022-03-28 22:35  时间完全不够用啊  阅读(464)  评论(0编辑  收藏  举报