一:dom4j方式介绍
对于xml的解析总共有三种
1:jaxp方式,是sun公司开发的,分为sax方式和dom方式
2:jdom方式,后来其中部分人员参与开发dom4j
3:dom4j方式,是现在企业使用比较多的一种方式
二:代码案例
1:读取xml文件中某个节点
1):获取第二个学生的名字
1 @Test 2 // 1:获取第二个学生的名字 3 public void test01() throws DocumentException { 4 // 1:获取解析器 5 SAXReader reader = new SAXReader(); 6 // 2:获取doc文档 7 Document doc = reader.read(new File("xml/exam.xml")); 8 // 3:获取根元素 9 Element root = doc.getRootElement(); 10 // 4:获取所有的学生节点 11 List list = root.elements("student"); 12 Element student = (Element) list.get(1); 13 String name = student.element("name").getText(); 14 System.out.println(name); 15 }
2):获取第2个学生的属性名和值
1 @Test 2 // 2:获取第2个学生的属性名和值 3 public void test02() throws DocumentException { 4 // 1:获取解析器 5 SAXReader reader = new SAXReader(); 6 // 2:获取doc文档 7 Document doc = reader.read(new File("xml/exam.xml")); 8 // 3:获取根元素 9 Element root = doc.getRootElement(); 10 // 4:获取所有的学生节点 11 List list = root.elements("student"); 12 Element student = (Element) list.get(1); 13 // String value = student.element("name").attribute("sid").getValue(); 14 String value = student.element("name").attributeValue("sid"); 15 System.out.println("sid:" + value); 16 }
2:向xml文档中添加节点
1 @Test 2 // 3:向第一个学生添加学分节点 3 public void test03() throws DocumentException, 4 IOException { 5 // 1:获取解析器 6 SAXReader reader = new SAXReader(); 7 // 2:获取doc文档 8 Document doc = reader.read(new File("xml/exam.xml")); 9 // 3:获取根元素 10 Element root = doc.getRootElement(); 11 // 4:获取所有的学生节点 12 Element student = root.element("student"); 13 student.addElement("score").setText("100"); 14 15 // 5:将内存中的内容写入xml文件中 16 XMLWriter writer = new XMLWriter(new FileOutputStream("xml/exam.xml")); 17 writer.write(doc); 18 writer.flush(); 19 writer.close(); 20 }
3:向指定位置添加节点
这里要遍历修改添加节点的父类得到list集合,然后将节点
添加到list集合的具体位置。
1 @Test 2 // 4:向指定位置添加节点(在第二个学生的年龄元素后面添加节点) 3 public void test04() throws DocumentException, IOException { 4 // 1:获取解析器 5 SAXReader reader = new SAXReader(); 6 // 2:获取doc文档 7 Document doc = reader.read(new File("xml/exam.xml")); 8 // 3:获取根元素 9 Element root = doc.getRootElement(); 10 // 4:获取第二个学生节点 11 Element student = (Element) root.elements("student").get(1); 12 List list = student.elements(); 13 14 // 创建分数节点 15 Element score = DocumentHelper.createElement("score"); 16 score.setText("100"); 17 // 将节点添加到学生节点 18 list.add(2, score); 19 20 // 将内存document写入xml 21 XMLWriter writer = new XMLWriter(new FileOutputStream("xml/exam.xml")); 22 writer.write(doc); 23 writer.close(); 24 }
4:删除节点
得到删除节点以及父节点,然后就可以操作了,比较简单
1 @Test 2 // 删除上一步添加的几点 3 public void test05() throws DocumentException, IOException, 4 FileNotFoundException { 5 // 1:获取解析器 6 SAXReader reader = new SAXReader(); 7 // 2:获取doc文档 8 Document doc = reader.read(new File("xml/exam.xml")); 9 // 3:获取根元素 10 Element root = doc.getRootElement(); 11 // 4:获取第二个学生节点 12 Element student = (Element) root.elements("student").get(1); 13 Element score = student.element("score"); 14 student.remove(score); 15 16 // 将内存document写入xml 17 XMLWriter writer = new XMLWriter(new FileOutputStream("xml/exam.xml")); 18 writer.write(doc); 19 writer.close(); 20 }
5:修改节点内容
1 @Test 2 // 修改第二个学生的性别 3 public void test06() throws DocumentException, IOException { 4 SAXReader reader = new SAXReader(); 5 Document doc = reader.read(new File("xml/exam.xml")); 6 7 Element root = doc.getRootElement(); 8 Element student = (Element) root.elements("student").get(1); 9 Element stuGender = student.element("gender"); 10 stuGender.setText("男"); 11 12 // 将内存document写入xml 13 XMLWriter writer = new XMLWriter(new FileOutputStream("xml/exam.xml")); 14 writer.write(doc); 15 writer.close(); 16 }
6:修改节点属性值
1 @Test 2 // 修改节点的属性(修改第二个学生的sid属性为345) 3 public void test07() throws DocumentException, IOException { 4 SAXReader reader = new SAXReader(); 5 Document doc = reader.read(new File("xml/exam.xml")); 6 7 Element root = doc.getRootElement(); 8 Element student = (Element) root.elements("student").get(1); 9 Attribute attr = student.attribute("sid"); 10 attr.setValue("345"); 11 12 // 将内存document写入xml 13 XMLWriter writer = new XMLWriter(new FileOutputStream("xml/exam.xml")); 14 writer.write(doc); 15 writer.close(); 16 }
三:Xpath的用法
由于dom4j的解析总是先解析根节点,然后再获取子节点.....,如果xml文件很很多层,那么解析起来会很麻烦,
所有dom4j开发出来Xpath,有点类似正则表达式的感觉
用例:
谓语:
测试案例:
//student :获取所有的xml中所有的student元素
[@username='username'] : 获取username为username值的student元素
1 @Test 2 public void testXpath() throws DocumentException { 3 // 模拟输入用户名和密码 4 String username = "Tom"; 5 String password = "123"; 6 7 SAXReader reader = new SAXReader(); 8 Document doc = reader.read("xml/exam.xml"); 9 10 Node node = doc.selectSingleNode("//student[@username='" + username 11 + "' and @password='" + password + "']"); 12 if (null != node) { 13 System.out.println("登录成功!"); 14 } else { 15 System.out.println("登录失败!"); 16 } 17 }