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() + "" + 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();
}
}
输出结果:
1
1
1
1
1
3
3
3
3
3
5
5
5
5
5
4
4
4
4
4
操作结束。