Web---XML---④Java解析XML---dom4j(第三方工具)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34928644/article/details/81976507

Dom4j是一个开源、灵活的XML API

目前很多开源框架如struts,hibernate都使用dom4j做为解析其xml的工具。

支持文档的读写功能和Xpath快速查询操作。

准备DOM4j

包:dom4j.x.jar

包结构:

org.dom4j

org.dom4j.io.SAXReader –  xml文档解析器

org.dom4j.DocumentElement  文档对像

Element的一些方法

Element.element(“name”) –此元素下的第一个name元素。

Element.elementIterator(“name”) – 此元素下的所有name元素。返回Iterator

Element.getText() – 返回元素包含的文本。

Element.getAttribute(“name”) – 返回名称为name的属性。

Element.addElement(“name”); - 添加一个name元素,同时返回name元素本身。

org.dom4j.io.XMLWriterDocument写出的对像。

准备XML数据:

文件放在在当前项目新建目录:xml 下,文件名:users.xml

<?xml version="1.0" encoding="UTF-8"?>
<users> 
  <user id="u001"> 
    <name>jack</name>  
    <age>22</age> 
  </user>  
  <user id="u002"> 
    <name>张三</name>  
    <age>20</age> 
  </user>  
  <user id="u003"> 
    <name>Rose</name>  
    <age>20</age> 
  </user>  
  <student id="s007">
    <name>王同学</name>
    <age>21</age>
  </student>
</users>

文件放在在当前项目新建目录:xml 下,文件名:xpathDemo.xml

<?xml version="1.0" encoding="UTF-8" ?>

<root>
	<aaa id="ra">
		<bbb id="rab"></bbb>
		<ccc id="rac">
			<bbb id="racb"></bbb>
		</ccc>
	</aaa>
	<bbb id="rb">
		<ccc id="rbc"></ccc>
	</bbb>
</root>

代码演示:


import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class Dom4jDemo {
	
	private Document dom;

	@Before
	public void Before() throws Exception  {
		//获取org.dom4j.io.SAXReader对象
		SAXReader reader = new SAXReader();
		//读取xml文件到内存中
		dom = reader.read("./xml/users.xml");
	}
	@After
	public void After() throws Exception {
		/*
		//获取org.dom4j.io.XMLWriter对象
		XMLWriter writer = new XMLWriter( new FileWriter("./xml/users.xml") );
		//把dom对象序列化(持久化)
		writer.write(dom);
		//注意关流---不仅考虑到安全性,字符流关流前还会刷一下缓存。
		writer.close();
		*/
	}
	
	@Test
	public void helloDom4j() {
		//执行这里时会先执行被@Before注解的函数
		
		Element root = dom.getRootElement();
		System.out.println(root.getName()); //users  //ok
		
		//这里执行完毕后会执行被@After注解的函数
	}
	
	//查询:查询每个user的信息
	@Test
	public void query() {
		Element root = dom.getRootElement();
		@SuppressWarnings("unchecked")
		List<Element> eUserList = root.elements("user");
		for (Element eUser : eUserList) {
			String id = eUser.attributeValue("id");
			//获取元素的文本内容 
			//法1
			String name = eUser.element("name").getTextTrim(); 
			//法2 
			String age = eUser.elementTextTrim("age");
			
			System.out.println(id+","+name+","+age);
		}
		System.out.println("------------------");
		//下面演示Iterator遍历
		@SuppressWarnings("unchecked")
		Iterator<Element> iterator = root.elementIterator("user");
		while(iterator.hasNext()) {
			Element eUser = iterator.next();
			String id = eUser.attributeValue("id");
			//获取元素的文本内容 
			//法1
			String name = eUser.element("name").getTextTrim(); 
			//法2 
			String age = eUser.elementTextTrim("age");
			
			System.out.println(id+","+name+","+age);
		}
	}
	
	//添加:添加一个学生信息
	@Test
	public void add() throws Exception {
		Element root = dom.getRootElement();
		
		//相对于标准的dom 方法 dom4j第三方工具就简单多了
		Element eStudent = root.addElement("student");
		//给eStudent元素添加属性
		eStudent.addAttribute("id", "s001");
		//给eStudent添加子元素<name>
		Element eName = eStudent.addElement("name");
		//设置<name>元素的文本内容
		eName.setText("宋同学");
		
		//给eStudent添加子元素<age>并且设置文本内容
		eStudent.addElement("age").setText("18");  //一步到位
		
		//注意上面只是对内存中dom树的操作,并不是修改xml文件
		//所以需要把内存的dom树序列化(持久化)
		//获取org.dom4j.io.XMLWriter对象
		XMLWriter writer = new XMLWriter( new FileWriter("./xml/users.xml") );
		//把dom对象序列化(持久化)
		writer.write(dom);
		//注意关流---不仅考虑到安全性,字符流关流前还会刷一下缓存。
		writer.close();
	}
	
	//添加:刪除根元素<users>的最后一个子元素
	@Test
	public void delLast() throws Exception {
		Element root = dom.getRootElement();
		
		@SuppressWarnings("unchecked")
		List<Element> elements = root.elements();
		if ( elements.size() <= 0 ) {
			return;
		}
		Element element = elements.get(elements.size()-1);
		//找父亲删除自己
		element.getParent().remove(element);
		//注意上面只是对内存中dom树的操作,并不是修改xml文件
		//所以需要把内存的dom树序列化(持久化)
		//获取org.dom4j.io.XMLWriter对象
		XMLWriter writer = new XMLWriter( new FileWriter("./xml/users.xml") );
		//把dom对象序列化(持久化)
		writer.write(dom);
		//注意关流---不仅考虑到安全性,字符流关流前还会刷一下缓存。
		writer.close();
	}
	
	//演示一下格式化输出
	@Test
	public void format() throws Exception {
		//紧凑型输出
		//OutputFormat format = OutputFormat.createCompactFormat();
		//漂亮型输出 -- 会有换行
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter writer = new XMLWriter( 
							new PrintWriter("./xml/users.xml"),
							format );
		writer.write(dom);
		writer.close();
		
		//查看一下xml文件观察哦
	}
	
	//添加:修改根元素<users>的最后一个子元素
	@Test
	public void updateLast() throws Exception {
		Element root = dom.getRootElement();
		
		@SuppressWarnings("unchecked")
		List<Element> elements = root.elements();
		if( elements.size() <= 0 ) {
			return;
		}
		Element element = elements.get(elements.size()-1);
		//注意dom4j中修改和添加属性都是采用addAttribute方法
		element.addAttribute("id", "s007"); 
		
		element.element("name").setText("王同学");
		//注意addText与addAttribute是不同的
		//addText是在原有的基础上进行追加
		//而addAttribute如果有内容就是修改,如果没有就是添加
		//element.element("age").addText("66");
		element.element("age").setText("21");
		
		//注意上面只是对内存中dom树的操作,并不是修改xml文件
		//所以需要把内存的dom树序列化(持久化)
		//获取org.dom4j.io.XMLWriter对象
		XMLWriter writer = new XMLWriter( new FileWriter("./xml/users.xml") );
		//把dom对象序列化(持久化)
		writer.write(dom);
		//注意关流---不仅考虑到安全性,字符流关流前还会刷一下缓存。
		writer.close();
	}
	
	@Test
	public void xpathHello() {
		String xpath = "//user"; //获取dom树上所有<user>元素 
		@SuppressWarnings("unchecked")
		List<Element> selectNodes = dom.selectNodes(xpath);
		for (Element element : selectNodes) {
			String id = element.attributeValue("id");
			//获取元素的文本内容 
			String name = element.elementTextTrim("name"); 
			String age = element.elementTextTrim("age");
			
			System.out.println(id+","+name+","+age);
		}
	}
	@Test
	public void xpathDemo() throws Exception {
		dom = new SAXReader().read("./xml/xpathDemo.xml");
		
		// xpath中   祖先//后代   //前后是 "祖先与后代" 关系
		// xpath中   父亲/孩子   //前后是直接 "父子" 关系
		
		//String xpath = "//bbb"; //dom树下的所有bbb元素
		String xpath = "//aaa/bbb"; //dom树下的所有aaa元素下的bbb直接子元素
		
		@SuppressWarnings("unchecked")
		List<Element> selectNodes = dom.selectNodes(xpath);
		for (Element element : selectNodes) {
			System.out.println( element.attributeValue("id") );
		}
		
	}
	
}

源码:

GitHub下载

猜你喜欢

转载自blog.csdn.net/qq_34928644/article/details/81976507