dom4j解析xml文件非常方便,本案例使用dom4j对xml进行增删改查操作,请认真看教程,首先引入dom4j-1.6.1.jar包,jar包下载地址:https://dom4j.github.io
一:首先在lib中引入dom4j-1.6.1.jar包,在src目录下创建student.xml文件,直接复制即可用,代码如下。
<?xml version="1.0" encoding="UTF-8"?> <xml-body> <student id="A100"> <name>小红</name> <age>18</age> <gender>女</gender> <address>广州天河骏景花园</address> </student> <student id="A101"> <name>小明</name> <age>17</age> <gender>男</gender> <address>广州天河华景新城</address> </student> </xml-body>
二:创建Student实体类,用于封装student.xml内容,实体类如下。
// 实体类,封装数据 public class Student { private String id; private String name; private char gender; private String age; private String address; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getAge() { return age; } public void setAge(String age) { this.age= age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public char getGender() { return gender; } public void setGender(char gender) { this.gender = gender; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Student [address=" + address + ", gender=" + gender + ", id=" + id + ", name=" + name + "]"; } }
三:在IStudentDao.java内定义增删改查的接口。
import java.util.List; // 接口, 定义规范 public interface IStudentDao { /** * 保存一个student * @param student 传入封装的student对象 */ void save(Student student); /** * 根据编号删除 * @param id */ void delete(String id); /** * 修改(根据id修改) * @param student */ void update(Student student); /** * 根据编号查询 * @param id * @return */ Student findById(String id); /** * 查询全部学员 * @return */ List<Student> findAll(); }
四:创建StudentDaoImpl接口实现类,实现IStudentDao中定义的增删改查接口方法。
import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; // 实现 public class StudentDaoImpl implements IStudentDao { // jdk1.5 只支持对类方法的Override,不支持接口! // jdk1.6以及以后的版本都支持对接口的Override // 如果@Override报错, 选中项目,右键,属性,找到java compiler 修改编译环境 @Override public Student findById(String id) { // 创建一个Dom4J解析器,加载xml,获取文档对象 Document doc = XmlUtils.getDocument(); // 获取根节点 Element root = doc.getRootElement(); try { // 获取根节点下,所有子节点 List<Element> list = root.elements(); for (Element e : list) { // e 表示每一个student, // 获取student的id属性 String idValue = e.attributeValue("id"); // 判断 if (id.equals(idValue)) { // 找到指定id的student Student student = new Student(); student.setId(id); student.setName(e.element("name").getTextTrim()); student.setGender(e.elementText("gender").charAt(0)); student.setAddress(e.elementText("address")); return student; } } } catch (Exception e) { // TODO Auto-generated catch block throw new RuntimeException(e); } return null; } @Override public void delete(String id) { try { Document doc = XmlUtils.getDocument(); Element root = doc.getRootElement(); List<Element> list = root.elements(); for (Element e : list) { if (id.equals(e.attributeValue("id"))) { // 找到了要删除的元素 // 通过父亲删除 // e.getParent().remove(e); // 自己删除自己 e.detach(); break; } } // 更新 XmlUtils.write2XML(doc); } catch (Exception e) { throw new RuntimeException(e); } } @Override public List<Student> findAll() { try { Document doc = XmlUtils.getDocument(); // 获取根节点 Element root = doc.getRootElement(); // list集合 List<Student> listStudent = new ArrayList<Student>(); List<Element> list = root.elements(); for (Element e : list) { // 获取每一个student节点, 再取其中数据 Student student = new Student(); student.setId(e.attributeValue("id")); student.setName(e.element("name").getTextTrim()); student.setGender(e.elementText("gender").charAt(0)); student.setAddress(e.elementText("address")); // 封装好的对象,添加到listStudent listStudent.add(student); } return listStudent; } catch (Exception e) { throw new RuntimeException(e); } } @Override public void save(Student student) { try { Document doc = XmlUtils.getDocument(); // 1. 获取跟节点 Element root = doc.getRootElement(); // 2. 给跟节点添加子节点-student Element ele_student = root.addElement("student"); // 2. 给跟节点student 添加id属性 ele_student.addAttribute("id", student.getId()); // 3. student节点,添加name子节点 ele_student.addElement("name").setText(student.getName()); // 3. student节点,添加age子节点 ele_student.addElement("age").setText("20"); // 3. student节点,添加gender子节点 ele_student.addElement("gender").setText(student.getGender() + ""); // 3. student节点,添加address子节点 ele_student.addElement("address").setText(student.getAddress()); // 4. 更新 XmlUtils.write2XML(doc); } catch (Exception e) { throw new RuntimeException(e); } } @Override public void update(Student student) { // 先根据id找到更新的student标签,再更新值 try { Document doc = XmlUtils.getDocument(); Element root = doc.getRootElement(); List<Element> list = root.elements(); for (Element e : list) { if (student.getId().equals(e.attributeValue("id"))) { // 找到更新的元素 // 获取更新的name标签,再设置值 e.element("name").setText(student.getName()); // 获取更新的age标签,再设置值 // e.element("age").setText("20"); // 获取更新的gender标签,再设置值 e.element("gender").setText(student.getGender() + ""); // 获取更新的address标签,再设置值 e.element("address").setText(student.getAddress()); break; } } // 更新 XmlUtils.write2XML(doc); } catch (Exception e) { throw new RuntimeException(e); } } }
五:由于第四步中每个方法都使用到了Document对象和,所以我把公共的方法抽取到了XmlUtils里面,代码如下:
public class XmlUtils { private static String path = "src/student.xml"; /** * 返回Document对象 */ public static Document getDocument(){ try { SAXReader reader = new SAXReader(); Document doc = reader.read(path); return doc; } catch (DocumentException e) { throw new RuntimeException(e); } } /** * 更新doc到默认的xml文件 * @param doc */ public static void write2XML(Document doc){ try { OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer = new XMLWriter(new FileOutputStream(new File(path)), format); writer.write(doc); writer.close(); } catch (Exception e) { throw new RuntimeException(e); } } }
六:测试dom4j方法,本人创建了App.java类,使用junit @Test方法来测试dom4j增删改查方法
import org.dom4j.DocumentException; import org.junit.Test; // 测试类 public class App { IStudentDao studentDao = new StudentDaoImpl(); // 测试 (用户,调用者 ) @Test public void findById() { try { Student stu = studentDao.findById("A100"); System.out.println(stu); } catch (Exception e) { System.out.println("当前网络忙,请稍后再试!"); e.printStackTrace(); // 开发时候查看异常 } } @Test public void delete() { try { studentDao.delete("A100"); } catch (Exception e) { System.out.println("当前网络忙,请稍后再试!"); e.printStackTrace(); // 开发时候查看异常 } } @Test public void save() { try { Student s = new Student(); s.setId("B10000"); s.setName("Test"); s.setGender('男'); s.setAddress("广州"); studentDao.save(s); } catch (Exception e) { e.printStackTrace(); } } @Test public void findAll() { try { System.out.println(studentDao.findAll()); } catch (Exception e) { e.printStackTrace(); } } @Test public void update() { try { Student s = new Student(); s.setId("B10000"); s.setName("Rose"); s.setGender('女'); s.setAddress("广州天河"); studentDao.save(s); } catch (Exception e) { e.printStackTrace(); } } }