依赖jar:
1、自定义文件
<?xml version="1.0" encoding="utf-8" ?> <Root> <user id="001"> <admin name="onepa"> <name id="ceId" yong="yes">fred</name> <password>150150</password> <age>22</age> </admin> <admin> <name>yucai</name> <password>123456</password> <age>21</age> </admin> </user> </Root>
2、demo类
package com.demo.dom4j; import org.dom4j.*; import org.dom4j.io.SAXReader; import java.io.File; import java.util.List; /** * 1.注意防止XXE注入攻击 * 2.获取标签属性值时,分两种情况 * 如果为Element对象实例时 * 1.attributes()方法 * 2.selectSingleNode("@name").getText(),该方法需要注意.selectSingleNode("@name")不为空,即确保用name属性可以选中该元素。 * 如果为Node对象的实例时: * 1.selectSingleNode("@name").getText(),该方法需要注意.selectSingleNode("@name")不为空,即确保用name属性可以选中该元素。 */ public class Test { public static void main(String[] args) { readXML01(); readXML02(); } /*** * dom4j 1.6版本集成了jaxen组件 * 解析xml文件,直接定位到需要选择的节点 * dom4j 2.10版本,jdk版本1.8 * jaxen.jar */ private static void readXML01() { // 需要解析的xml文件 String path = "F:\java-demo\java-demo\src\com\demo\dom4j\info.xml"; File file = new File(path); // xml解析对象 SAXReader reader = new SAXReader(); // dom4j中的文档对象模型 Document document = null; try { // 将需要解析的xml文件转换成dom4j中的文档对象模型 document = reader.read(file); // 使用dom4j解析XML时,要快速获取某个节点的数据,使用XPath是个不错的方法,需要jaxen.jar包支持.需要解析的节点路径,路径由xml文件中的标签组成 // 该路径包含两种情况:1.该节点下面还有子节点。2.该节点下无子节点 String pathBq = "Root/user/admin/name"; List<Node> nodeList = document.selectNodes(pathBq); // 根据节点路径定位节点,Node为dom4j中的类 for(Node node : nodeList) { System.out.println("*******************************************"); // 当xpath下无子节点时,getText()和getStringValue()返回值一样 System.out.println("标签名称:"+node.getName()); System.out.println("标签元素值:"+node.getText()); System.out.println("标签下所有子标签元素值:"+node.getStringValue()); // 判断当前节点是否可以通过属性值yong选中,即判断当前节点是否具有yong属性。 if (null != node.selectSingleNode("@yong")) { System.out.println("该标签有yong属性,其值为:"+node.selectSingleNode("@yong").getText()); } } } catch (DocumentException e) { e.printStackTrace(); } } /*** * 多级父元素属性值的获取 */ private static void readXML02() { String path = "F:\java-demo\java-demo\src\com\demo\dom4j\info.xml"; File file = new File(path); SAXReader reader = new SAXReader(); Document document = null; try { document = reader.read(file); String pathBq = "Root/user/admin/name"; List<Node> nodeList = document.selectNodes(pathBq); for(Node node : nodeList) { System.out.println("************************************"); Element oneparent = node.getParent();// 获取节点的父元素 Element twoparent = node.getParent().getParent();//获取元素的父元素 System.out.println("一级父元素标签名:"+oneparent.getName()); List<Attribute> attributes = oneparent.attributes();// 父元素的所有属性值 for (Attribute temp : attributes) { System.out.println("属性名称:"+temp.getName()); System.out.println("属性值:"+temp.getValue()); } System.out.println("二级父元素标签名:"+twoparent.getName()); } } catch (DocumentException e) { e.printStackTrace(); } } }