博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java Xml 操作之 dom4j 详解和实现一个xml存储的学生管理系统
阅读量:3961 次
发布时间:2019-05-24

本文共 7866 字,大约阅读时间需要 26 分钟。

dom4j是什么?

dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。

使用dom4j对XML文件进行解析

第一步:当然还是去下载这个dom4j 的jar包。

第二步:编写一个xml文档,如下所示:在使用eclipes的情况,默认编码是GBK,在这里我就使用GBK进行编码,后续编写的时候可以把eclipes的编码进行设置之后在对xml文件的encoding编码设置成utf-8。

张三
19
new 李四
20
王五
20

之后就是使用java的dom4j对这个xml进行解析了,在这里使用到SAXReader对象的read方法读取xml文件,如下代码所示:

SAXReader reader = new SAXReader();		//路径的区别,不添加任何前缀是项目的路径		Document document = reader.read(new File("Student.xml"));		// 返回的document对象是一个string对象,使用asXML方法将xml文件转换为string类型。		System.out.println(document.asXML());

在这里输出这个对象其实也就是已经获取到了这个xml文件,输出的就是xml文件的内容。

对文档进行解析,我们首先要从根节点root进行获取,在这里的document的getRootElement就可以获取到这个xml文件的根节点。

Element root = document.getRootElement();		System.out.println(root);

在这里我们获取xml文件的根节点,也就是students对象节点,而我们需要获取这个节点的子节点的内容等等,需要使用一个迭代器进行循环遍历获取,使用以下代码实现:

// 使用迭代器进行迭代,对xml当中的student进行迭代		for (Iterator i = root.elementIterator("student"); i.hasNext();) {
Element element = (Element) i.next(); // System.out.println(element.getName());//获取到student Attribute id = element.attribute("id"); // System.out.println(id); String id_2 = element.attributeValue("id");// 取到id的值,根据键进行取值 System.out.println("id = " + id_2); String name = element.elementText("name"); System.out.println("name = " + name); String age = element.elementText("age"); System.out.println("age = " + age); }

其中获取子标签的属性使用attributeValue方法,这个方法当中传递一个属性名就可以获取到,获取的数据类型是一个String。而获取下一个子标签的节点,使用elementText方法也就是获取该标签的内容。这样就可以把这个xml文档的所有属性值和内容进行输出,也就完成了解析。

而同样获取所有节点的数据还有另一种方法,使用到根节点.elements方法,返回的是一个list集合,这个集合很显然是Element的数据类型,获取之后我们可以对这个list集合进行for循环增强进行遍历输出。如下代码所示:

Element root = document.getRootElement();		List
students = root.elements(); for (Element student : students) {
System.out.println(student.attributeValue("id")); System.out.println(student.elementText("name")); System.out.println(student.elementText("age")); }

使用dom4j对XML文件进行增删改查操作

在上方的代码就演示了查找的功能,在下方演示其他的功能实现。

使用dom4j对XML文件进行增加节点操作

增加节点:和前面的大致相同,先使用SAXReader对象的read方法读取xml文件,之后使用document获取到root根节点,在添加节点的地方Java提供了一个addElement方法用于添加节点。在添加节点的时候我们可以顺便给这个节点添加一个属性,使用addAttribute方法。而就给节点添加内容则使用addText方法进行添加,添加属性要添加属性名和属性值所以需要传入两个参数,而添加内容只需要加入文本内容即可。

Element student = root.addElement("student").addAttribute("id", "4"); // 添加节点		student.addElement("name").addText("王五");		student.addElement("age").addText("20");//在这里定义好了要写入的数据

在这里定义好需要添加的节点内容之后,我们需要写入到xml文件当中,使用到一个新的对象XMLWriter,这个对象提供的write方法就可以进行写入操作,而这里需要加入两个参数,第一个参数表示要写入的文件,第二个参数表示写入流OutputFormat,代码如下所示

OutputFormat format =OutputFormat.createPrettyPrint();		format.setEncoding("GBK");				XMLWriter writer = new XMLWriter(new FileWriter(new File("Student.xml")),format);		writer.write(document);		writer.close();

在这里还需要设置编码格式,这里因为我没有修改编码格式,所以使用GBK进行,一般使用utf-8编码。

使用dom4j对XML文件进行删除节点操作

整体上和前面是一致的,获取到root根节点,在获取到这个需要删除的节点,使用xpath的语法进行查找,在这里使用document提供的selectSingleNode方法进行查找到这个节点。而进行删除的时候我们需要先获取到这个节点的父节点再进行删除。代码实现如下:

Element student =(Element) document.selectSingleNode("//student[@id='1']");		student.getParent().remove(student);

在这里也只是查找到了这个节点然后进行删除,但是到最后还是需要写入文件才能够对xml文件进行写入修改。和上述增加节点的写入方式一致。

使用dom4j对XML文件进行节点更新操作

对节点进行更新,这里还是先需要找到这个修改更新的节点,之后可以对这个节点设置属性和文本值,

Element student = (Element) document.selectSingleNode("//student[@id='2']");	student.element("name").addAttribute("班级", "rk1836");	student.element("name").setText("new 李四");

之后设置完成之后同样写入xml,即完成了修改。

到这里使用dom4j对xml文件进行增删改查就都已经实现了。那我们可以通过以上的代码进行实现一个学生管理系统(使用xml文件进行存储数据)

学生管理系统(使用xml文件存储)

对于学生管理系统我们要实现的的功能基本上都是增删改查,在上面我们已经能够对xml文件进行操作了。所以在这里我们就可以对这个系统进行实现了。

第一步:明确需要的信息并进行定义

对于一个学生的成绩信息进行管理,我们要明确学生对应多少信息,新建一个Student学生类。包含了id、姓名、年龄、成绩4个信息,对变量进行getter/setter封装,加上一个带参数的构造方法。

public class Student {
private int id; private String name; private int age; private int score; public Student(int id, String name, int age, int score) {
this.id = id; this.name = name; this.age = age; this.score = score; }}

第二步:根据已明确的信息对xml文件进行定义

在这里我们已经明确了学生的信息了,就可以根据刚才定义的信息来编写一个xml文件,在这里我们只加入一条数据作为测试。

黄月月
18
58

第三步:明确要实现的功能

在这里系统当中实现5个小的功能模块,分别为1:录入 , 2:打印 ,3:修改,4:删除,5:根据id查询。在这里我们也不做页面展示了,直接在控制台进行输出测试,使用Scanner类做页面交互。

准备工作:在main主方法当中对全局都需要使用的进行定义,包括对dom4j操作的SAXReader类,和获取到根节点,以及接收输入的Scanner。

final String file = "xml/Student.xml";		Scanner sc = new Scanner(System.in);		SAXReader reader = new SAXReader();		Document document = reader.read(new File(file));		Element root = document.getRootElement();

使用while(true)循环是的程序运行不退出,里面加上switch case,对输入不同的值来进行不同的后续操作:

System.out.println("1:录入 , 2:打印 ,3:修改,4:删除,5:根据id查询");		int num = sc.nextInt();		switch (num)

switch这个输入的数字之后进行case。之后对每一个case进行分析,第一个case,录入信息,首先我们使用Scanner类接收用户输入的信息,之后使用一个student类的对象对这些输入的信息进行封装成对象,方便后续的取值和运算等,之后再进行添加,添加完成之后还需要进行写入到xml文件当中,

System.out.println("請輸入學號");		int id = sc.nextInt();		System.out.println("请输入姓名");		String name = sc.next();		System.out.println("请输入年龄");		int age = sc.nextInt();		System.out.println("请输入成绩");		int score = sc.nextInt();		Student student = new Student(id, name, age, score);		Element ele = root.addElement("student").addAttribute("id", student.getId() + "");		ele.addElement("name").addText(student.getName());		ele.addElement("age").addText(student.getAge() + "");		ele.addElement("score").addText(student.getScore() + "");		Util.writeXML(document, file);		System.out.println("录入成功");

在这里代码是一致的,所以说我们可以对这一段代码块进行封装成一个方法,新建一个工具类Util。

public static void writeXML(Document document, String FileName) throws Exception {
OutputFormat format =OutputFormat.createPrettyPrint(); format.setEncoding("GBK"); XMLWriter writer = new XMLWriter(new FileWriter(new File(FileName)),format); writer.write(document); writer.close(); }

第二个case,打印出所有学生的信息,由根节点提供的elements方法就可以获取到所有的根节点,返回的是一个List集合,类型是Element,直接使用foreach循环输出即可。

List
list = root.elements(); for (Element e : list) {
String student_id = e.attributeValue("id"); String student_name = e.elementText("name"); String student_age = e.elementText("age"); String student_score = e.elementText("score"); System.out.println("学号 :" + student_id + " ,姓名:" + student_name + " ,年龄:" + student_age + " ,成绩:" + student_score); }

第三个case,对输入的id进行xpath的拼接进行调用,对score进行重新赋值。最后写入

System.out.println("请输入要修改的学生的学号");		int UpdateId = sc.nextInt();		String XPath = "//student[@id=" + "'" + UpdateId + "']";		Element UpdateNode = (Element) document.selectSingleNode(XPath);		System.out.println("重新输入分数");		String NewScore =sc.next();		UpdateNode.element("score").setText(NewScore);		Util.writeXML(document, file);		System.out.println("修改成功");

第四个case,删除节点,同理根据id进行Xpath拼接,使用删除节点的方法进行删除即可。

System.out.println("请输入要删除的学生学号");		int DeleteId = sc.nextInt();		String DXPath = "//student[@id=" + "'" + DeleteId + "']";		Element DeleteNode = (Element) document.selectSingleNode(DXPath);		DeleteNode.getParent().remove(DeleteNode);		Util.writeXML(document, file);		System.out.println("删除成功");

第五个case,使用selectSingleNode查询到单个节点,获取下面的值进行打印即可

System.out.println("请输入要查找的学生学号");		int SelectId = sc.nextInt();		String SXPath = "//student[@id=" + "'" + SelectId + "']";		Element SelectNode = (Element)document.selectSingleNode(SXPath);		String student_id = SelectNode.attributeValue("id");		String student_name = SelectNode.elementText("name");		String student_age = SelectNode.elementText("age");		String student_score = SelectNode.elementText("score");		System.out.println("学号 :" + student_id + " ,姓名:" + student_name + " ,年龄:" 				+ student_age + " ,成绩:"+ student_score);

到这里就开发完成了,就实现了使用xml文件进行存储的学生管理系统。

转载地址:http://jkqzi.baihongyu.com/

你可能感兴趣的文章
做事情要放下面子,拿起责任
查看>>
敏捷开发实践(1)-故事工作量估算导致的问题
查看>>
记一次解决jenkins持续构建,自动部署的问题
查看>>
敏捷开发实践(2)-要不要文档?
查看>>
敏捷开发实践(3)-我们为什么需要持续集成?
查看>>
《java系统性能调优》--2.缓存
查看>>
JAVA注解引发的思考
查看>>
//基于redisTemplate工具类RedisHelper
查看>>
SpringBoot+RabbitMQ
查看>>
写博意味着什么
查看>>
一些时间管理法则和我自己的时间管理法则
查看>>
变量的声明和作用域——VB
查看>>
VB总结
查看>>
静态数组的声明与例子练习
查看>>
动态数组的声明与例子练习
查看>>
The Road Not Taken
查看>>
VB全局对象
查看>>
比较Cint() , int() , fix() ,round()的区别
查看>>
举例说明常用字符串处理函数
查看>>
用Mindmanager整理的VB常用函数
查看>>