【java】dom4j 生成/解析/修改xml数据
目录如下:
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j --> <dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.1</version> </dependency>
这里要注意版本号,如果版本号过低,需要额外再引入一个依赖,否则可能会导致项目启动不了。如下:
<dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>jaxen</groupId> <artifactId>jaxen</artifactId> <version>1.1.1</version> </dependency>
//格式: //<?xml version="1.0" encoding="UTF-8"?> //<User> // <name>张三</name> // <age>22</age> // <sex>1</sex> //</User> public static void main(String[] args) { try{ //创建一个xml格式的字符串 String xmlStr = "字符串为上面的xml格式数据"; // 创建saxReader对象 SAXReader reader = new SAXReader(); //解析XML形式的文本,得到document对象 Document document = DocumentHelper.parseText(xmlStr); //读取文件中的数据并解析 //Document document = reader.read(new File("test.xml")); //获取根节点(User) Element root = document.getRootElement(); //获取根节点下子节点的值 String name = root.elementTextTrim("name");//张三 String age = root.elementTextTrim("age");//22 String sex = root.elementTextTrim("sex");//1 }catch (Exception e){ e.printStackTrace(); } }
public static void main(String[] args) { //格式: //<?xml version="1.0" encoding="UTF-8"?> //<Users> // <User> // <name>张三</name> // <age>22</age> // <sex>1</sex> // </User> // <User> // <name>李四</name> // <age>23</age> // <sex>0</sex> // </User> //</Users> try{ //创建一个xml格式的字符串 String xmlStr = "字符串为上面的xml格式数据"; // 创建saxReader对象 SAXReader reader = new SAXReader(); //解析XML形式的文本,得到document对象 Document document = DocumentHelper.parseText(xmlStr); //获取根节点(Users) Element root = document.getRootElement(); //获取根节点下子节点集合(User) Iterator<Element> user = root.elementIterator("User"); while (user.hasNext()){ Element element = (Element)user.next(); String name = element.elementTextTrim("name"); String age = element.elementTextTrim("age"); String sex = element.elementTextTrim("sex"); //结果 name=张三age=22sex=1 name=李四age=23sex=0 System.out.println("name="+name+"age="+age+"sex="+sex); } }catch (Exception e){ e.printStackTrace(); } }
public static void main(String[] args) { //格式: //<?xml version="1.0" encoding="UTF-8"?> //<User id="01"> // <name id="02">张三</name> // <age>22</age> // <sex>1</sex> //</User> try{ //创建一个xml格式的字符串 String xmlStr = "字符串为上面的xml格式数据"; // 创建saxReader对象 SAXReader reader = new SAXReader(); //解析XML形式的文本,得到document对象 Document document = DocumentHelper.parseText(xmlStr); //获取根节点(User) Element root = document.getRootElement(); //获取根节点的id属性值 String id = root.attributeValue("id"); //获取子节点name的id值 Element name = root.element("name"); String name_id = name.attributeValue("id"); //结果 name_id属性值=02 System.out.println("name_id属性值="+name_id); //结果 User_id属性值=01 System.out.println("User_id属性值="+id); }catch (Exception e){ e.printStackTrace(); } }
public static void main(String[] args) { //格式: //<?xml version="1.0" encoding="UTF-8"?> //<Users> // <User id="01"> // <name>张三</name> // <age>22</age> // <sex>1</sex> // </User> // <User id="02"> // <name>李四</name> // <age>23</age> // <sex>0</sex> // </User> //</Users> try{ //创建xml格式字符串 String text = "字符串为上面的xml格式数据"; //将字符串转为document对象 Document document = DocumentHelper.parseText(text); //获取根节点 Element rootElement = document.getRootElement(); //获取根节点下所有子节点 List<Element> elements = rootElement.elements(); //循环子节点 for (Element element : elements) { //获取每个子节点的所有属性值 List<Attribute> attributes = element.attributes(); //不知属性名 已知属性名用element.attributeValue("id") for (Attribute attr : attributes) { //结果 id:01 id:02 System.out.println(attr.getName()+":"+attr.getValue()); } List<Element> elementChilds = element.elements(); for (Element elementChild : elementChilds) { //结果:name:张三 age:22 sex:1 name:李四 age:23 sex:0 System.out.print(elementChild.getName()+":"+elementChild.getText()); } } }catch (Exception e){ e.printStackTrace(); } }
dom4j提供了两个方法支持XPath搜索:
-
List selectNodes(String expr);
-
Node selectSingleNode(String expr);
Xpath表达式的几种写法:
第一种形式: /AAA/BBB/CCC:表示层级结构,表示AAA下面BBB下面的所有CCC
第二种形式: //BBB:选择文档中所有的BBB元素
第三种形式: /AAA/BBB/:选择目录下的所有元素 ////BBB:选择有三个祖先元素的BBB元素 //*:选择所有的元素
第四种形式: //AAA[1]/BBB:选择第一个AAA下的BBB元素 //AAA/BBB[1]:选择所有AAA的第一个BBB元素 //AAA/BBB[last()]:选择所有AAA的最后一个BBB元素
第五种形式: //@id:选择所有的id属性 //BBB[@id]:选择具有id属性的BBB元素
第六种形式:
<!-- 使用xpath需要引入的包 --> <!-- https://mvnrepository.com/artifact/jaxen/jaxen --> <dependency> <groupId>jaxen</groupId> <artifactId>jaxen</artifactId> <version>1.1.6</version> </dependency>
public static void main(String[] args) { //格式: //<?xml version="1.0" encoding="utf-8"?> //<classroom grade="primary5"> // <persons> // <teacher id="1"> // <property name="name" value="laosi"/> // <property name="age" value="24"/> // </teacher> // // <students> // <student id="1"> // <property name="name" value="lisi"/> // <property name="age" value="12"/> // </student> // <student id="2"> // <property name="name" value="zhangsan"/> // <property name="age" value="12"/> // </student> // <student id="3"> // <property name="name" value="wangwu"/> // <property name="age" value="12"/> // </student> // </students> // </persons> //</classroom> try{ //创建xml格式字符串 String text = "字符串为上面的xml格式数据"; //将字符串转为document对象 Document document = DocumentHelper.parseText(text); //拿到了student的父标签 students Node students = document.selectSingleNode("/classroom/persons/students"); //输出students下包含students的所有xml格式的字符串 System.out.println(students.asXML()); //拿到了所有的student标签 List<Node> nodes = students.selectNodes("/classroom/persons/students/student"); for (Node node : nodes) { //输出所有student且包含student层级的xml格式的字符串 System.out.println(node.asXML()); } }catch (Exception e){ e.printStackTrace(); } }
主要思路为通过String、StringBuffer、StringBuilder拼接出来xml格式的字符串,之后转成document对象
public static void main(String[] args) { //格式: //<?xml version="1.0" encoding="UTF-8"?> //<User> // <name>张三</name> // <age>22</age> // <sex>1</sex> //</User> try{ //创建一个xml格式的字符串 String xmlStr = "字符串为上面的xml格式数据"; //创建document Document document = DocumentHelper.parseText(xmlStr); }catch (Exception e){ e.printStackTrace(); } }
public static void main(String[] args) { //格式: //<?xml version="1.0" encoding="UTF-8"?> //<User> // <name>张三</name> // <age>22</age> // <sex>1</sex> //</User> try{ //创建document Document document = DocumentHelper.createDocument(); //创建根节点 Element root = DocumentHelper.createElement("User"); document.setRootElement(root); //创建根节点下的三个子节点 Element name = root.addElement("name"); Element age = root.addElement("age"); Element sex = root.addElement("sex"); //为子节点赋值 name.setText("张三"); age.setText("22"); sex.setText("1"); //结果:<?xml version="1.0" encoding="UTF-8"?><User><name>张三</name><age>22</age><sex>1</sex></User> System.out.println(document.asXML()); //这里要注意:如果没有为节点赋值,可能会出现下面这种单节点的形式 //<?xml version="1.0" encoding="UTF-8"?><User><name/><age/><sex/></User> }catch (Exception e){ e.printStackTrace(); } }
public static void main(String[] args) { try{ //创建document Document document = DocumentHelper.createDocument(); //创建根节点 Element root = DocumentHelper.createElement("User"); document.setRootElement(root); //添加注释 root.addComment("这是根节点"); //添加属性 root.addAttribute("id", "01"); //结果:<?xml version="1.0" encoding="UTF-8"?><User id="01"><!--这是根节点--></User> System.out.println(document.asXML()); }catch (Exception e){ e.printStackTrace(); } }
//生成代码同上,只需传入document对象即可 // 创建格式化类 OutputFormat format = OutputFormat.createPrettyPrint(); // 设置编码格式,默认UTF-8 format.setEncoding("UTF-8"); // 创建输出流,此处要使用Writer,需要指定输入编码格式,使用OutputStream则不用 FileOutputStream fos = new FileOutputStream("d:/test.xml"); // 创建xml输出流 XMLWriter writer = new XMLWriter(fos, format); // 生成xml文件 writer.write(document); writer.close();
public static void main(String[] args) { try{ //创建document Document document = DocumentHelper.createDocument(); //创建根节点 Element root = DocumentHelper.createElement("User"); document.setRootElement(root); //添加注释 root.addComment("这是根节点"); //添加属性 root.addAttribute("id", "01"); //添加节点 Element name = root.addElement("name"); //添加节点值 name.setText("张三"); //结果:<User id="01"><!--这是根节点--><name>张三</name></User> System.out.println(document.asXML()); }catch (Exception e){ e.printStackTrace(); } }
public static void main(String[] args) { try{ //创建document Document document = DocumentHelper.createDocument(); //创建根节点 Element root = DocumentHelper.createElement("User"); document.setRootElement(root); //添加注释 root.addComment("这是根节点"); //添加属性 root.addAttribute("id", "01"); //添加节点 Element name = root.addElement("name"); //添加节点值 name.setText("张三"); //结果:<User id="01"><!--这是根节点--><name>张三</name></User> System.out.println(document.asXML()); //修改属性值 方法2:root.addAttribute("id", "02"); root.setAttributeValue("id", "02"); //修改节点值 name.setText("李四"); //修改注释 //结果:<User id="02"><!--这是根节点--><name>李四</name></User> System.out.println(document.asXML()); }catch (Exception e){ e.printStackTrace(); } }
public static void main(String[] args) { try{ //创建document Document document = DocumentHelper.createDocument(); //创建根节点 Element root = DocumentHelper.createElement("User"); document.setRootElement(root); //添加注释 root.addComment("这是根节点"); //添加属性 root.addAttribute("id", "01"); //添加节点 Element name = root.addElement("name"); //添加节点值 name.setText("张三"); //结果:<User id="01"><!--这是根节点--><name>张三</name></User> System.out.println(document.asXML()); //删除属性 root.remove(root.attribute("id")); //删除节点值 name.setText(""); //删除注释 //结果:<?xml version="1.0" encoding="UTF-8"?><User><!--这是根节点--><name></name></User> System.out.println(document.asXML()); //删除所有注释 //结果:<?xml version="1.0" encoding="UTF-8"?><User><name></name></User> System.out.println(document.asXML().replaceAll("(?s)<\\!\\-\\-.+?\\-\\->", "")); }catch (Exception e){ e.printStackTrace(); } }
参考: