一个小故事:当年Java准备做对XML的解析时,对解析器的实现方向在内部发生了争执,后来高层没有听从工程师建议,坚持开发出了JDOM,而主要的工程师选择离开Java 按照自己的方式实现,就是DOM4J 。后来结果表明,DOM4J 完胜了JDOM。下面,让我们来了解一下通过DOM4J 实现对XML文件进行增删改查的过程。
1、待解析的XML文件:
- <span style="font-size:14px;">
- <?xml version="1.0" encoding="utf-8"?>
- <students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://www.itcast.cn/xml"
- xsi:schemaLocation="http://www.itcast.cn/xml students.xsd">
- <student number="ITCAST_1001">
- <name>zhangSan</name>
- <age>23</age>
- <sex>male</sex>
- </student>
- </students>
- </span>
2、用DOM4J实现增删改查:
- <span style="font-size:14px;">
- public class Demo3 {
- @Test
- public void method1() throws Exception {
- // 创建解析器
- SAXReader reader = new SAXReader();//这个是用来读取文件内容的
- Document doc = reader.read(new File("students.xml")); //指定要读取的文件
- //System.out.println(doc.asXML()); //打印出文件
- }
- //实现对XML文件的复制
- @Test
- public void method2() throws Exception {
- // 得到Document
- SAXReader reader = new SAXReader();
- Document doc = reader.read(new File("students.xml"));
- // 保存Document,指定将写入的目的文件(复制功能)
- XMLWriter writer = new XMLWriter(new FileOutputStream("students_copy.xml"));
- writer.write(doc); //开始写入
- }
- //遍历Document
- @Test
- public void method3() throws Exception {
- // 要遍历文档,首先要得到Document对象
- SAXReader reader = new SAXReader();
- Document doc = reader.read(new File("students.xml"));
- //获取根元素
- Element root = doc.getRootElement();
- //获取根元素中所有student元素
- List<Element> stuEleList = root.elements("student");
- // 循环遍历所有学生元素
- for(Element stuEle : stuEleList) {
- //获取学生元素的number
- String number = stuEle.attributeValue("number");
- //获取学生元素名为name的子元素的文本内容
- String name = stuEle.elementText("name");
- //获取学生元素名为age的子元素的文本内容
- String age = stuEle.elementText("age");
- //获取学生元素名为sex的子元素的文本内容
- String sex = stuEle.elementText("sex");
- System.out.println(number + ", " + name + ", " + age + ", " + sex);
- }
- }
- //添加元素
- @Test
- public void method4() throws Exception {
- // 得到Document
- SAXReader reader = new SAXReader();
- Document doc = reader.read(new File("src/students.xml"));
- //获取root元素
- Element root = doc.getRootElement();
- Element stuEle = root.addElement("student"); //添加了student元素
- // 给stuEle添加属性,名为number,值为1003
- stuEle.addAttribute("number", "1003");
- // 分别为stuEle添加名为name、age、sex的子元素,并为子元素设置文本内容
- stuEle.addElement("name").setText("wangWu");
- stuEle.addElement("age").setText("18");
- stuEle.addElement("sex").setText("male");
- // 设置保存的格式化器 1. \t,使用什么来完成缩进 2. true, 是否要添加换行
- OutputFormat format = new OutputFormat("\t", true);
- format.setTrimText(true); //去掉空白
- // 在创建Writer时,指定格式化器
- XMLWriter writer = new XMLWriter(new FileOutputStream("src/students_copy.xml"), format);
- writer.write(doc);
- }
- //修改元素
- @Test
- public void method5() throws Exception {
- // 得到Document
- SAXReader reader = new SAXReader();
- Document doc = reader.read(new File("src/students_copy.xml"));
- //使用XPath找到符合条件的元素
- // 查询student元素,条件是number属性的值为1003
- Element stuEle = (Element) doc.selectSingleNode("//student[@number='ITCAST_1003']");
- //修改stuEle的age子元素内容为81
- stuEle.element("age").setText("81");
- //修改stuEle的sex子元素的内容为female
- stuEle.element("sex").setText("female");
- }
- //删除元素
- @Test
- public void method6() throws Exception {
- // 得到Document
- SAXReader reader = new SAXReader();
- Document doc = reader.read(new File("src/students_copy.xml"));
- // 查找student元素,条件是name子元素的文本内容为wangWu
- Element stuEle = (Element) doc.selectSingleNode("//student[name='wangWu']");
- // 2. 获取父元素,使用父元素删除指定子元素
- stuEle.getParent().remove(stuEle);
- }
- }
- </span>