博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dom4j解析节点元素的crud和xpath
阅读量:3908 次
发布时间:2019-05-23

本文共 7611 字,大约阅读时间需要 25 分钟。

实现crud步骤:

(1)获得解析器:
SAXReader reader = new SAXReader();
(2获得文档:
reader.read(“URL”);获得一个Document对象:
(3)获得根节点:
getRootElement(); Element:
(4)子节点:
elementIterator(“name”)
elementIterator(); //返回的类型: Iterator迭代器:
elements();List
elements(“name”); list
element(“name”); Element

(5)xml文件的回写: XMLWriter xml = new XMLWriter("OutputStream out","OutputFormat format");source: DOMSource 实现类: format: 格式< 漂亮格式:  < 压缩格式:

案例:

操作标签当中的属性:
属性的查询:
属性的添加:
属性的删除:
顺序的修改:

封装的 dom4j工具类:

package com.yidongxueyuan.util;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.UnsupportedEncodingException;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;/** *  * @author Mrzhang * @version 1.0  * @see org.dom4j.Document  * @since 1.0  * */public class Dom4JUtil {			private Dom4JUtil(){			}		/**	 *  提供了一个方法, 获得document文档对象: 	 * @return document: 文档对象: 	 */	public static Document getDocument(String filename){		try {			//解析器: 			SAXReader reader = new SAXReader();			//获得文档: 			Document document = reader.read(filename);			return document;		} catch (DocumentException e) {			throw new RuntimeException(e);		}	}		/**	 * 	 * @param document 文档对象	 * @param filename 文件路径	 */	public static void write2File(Document document, String filename){		try {			OutputFormat format = OutputFormat.createPrettyPrint(); 			XMLWriter writer=  new XMLWriter(new FileOutputStream(filename),format);						writer.write(document); 						writer.close();		} catch (IOException e) {			e.printStackTrace();		} 	}}

然后下面是用util包

封装到document而不是到根节点,是为了保证耦合度低。

package com.yidongxueyuan.dom4j;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.Element;import org.junit.Test;import com.yidongxueyuan.util.Dom4JUtil;public class AttributeOperator {	//属性节点的添加操作: 	@Test	public void testAttUpdate() throws Exception {		Document document = Dom4JUtil.getDocument("src/students.xml");				//获得根: 		Element root = document.getRootElement();				//标签节点: 		Element studentEle  =(Element) root.elements("student").get(1);				//studentEle.addAttribute("name", "张王杰");				studentEle.setAttributeValue("name", "张玉洁");				Dom4JUtil.write2File(document, "src/students.xml");			}		//属性节点的添加操作: 	@Test	public void testAttAdd() throws Exception {		//获得文档: 		Document document = Dom4JUtil.getDocument("src/students.xml");				//获得根: 		Element root = document.getRootElement();				//标签节点: 		Element studentEle  =(Element) root.elements("student").get(1);				studentEle.addAttribute("name", "张玉洁");						Dom4JUtil.write2File(document, "src/students.xml");			}				//属性的查询操作: 查询所有name对应的值:  	@Test	public void testAttDelete() throws Exception {				//属性的删除: 				//获得文档: 		Document document = Dom4JUtil.getDocument("src/students.xml");				//获得根: 		Element root = document.getRootElement();				//标签节点: 		Element studentEle  =(Element) root.elements("student").get(1);				//属性节点: 		Attribute attribute = studentEle.attribute("name");			//标签节点删除属性节点: 		studentEle.remove(attribute); 				//回写: 		Dom4JUtil.write2File(document, "src/students.xml");			}	//属性的查询操作: 查询所有name对应的值:  	@Test	public void testattFindAll() throws Exception {				//获得文档: 		Document document = Dom4JUtil.getDocument("src/students.xml");				//获得根: 		Element root = document.getRootElement();				Element studentEle  =(Element) root.elements("student").get(1);				//对应多个属性: 		List
attributes = studentEle.attributes(); for(int i=0; i<=attributes.size()-1;i++){ Attribute attribute = attributes.get(i); //获得属性的值: String value = attribute.getValue(); System.out.println(value); } } //属性的查询操作: 查询某个name对应的值: @Test public void testattFind() throws Exception { //获得文档: Document document = Dom4JUtil.getDocument("src/students.xml"); //获得根: Element root = document.getRootElement(); //获得第二个学生对象: student: Element studentEle =(Element) root.elements("student").get(1); //调用方法,进行属性的查询操作: attribute(name); Attribute attribute = studentEle.attribute("name"); String value = attribute.getValue(); System.out.println(value); }}
package com.yidongxueyuan.dom4j;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.junit.Test;import com.yidongxueyuan.util.Dom4JUtil;public class Dom4JOperator {		//节点元素的修改操作: 	@Test	public void testUpdate() throws Exception {		/*		 * 1:获得根: 		 * 2: 获得user节点: 		 * 3: 获得school节点:		 * 4: 修改值: 		 * 5:回写: 		 * 		 */				//使用工具类获得文档: 		Document document = Dom4JUtil.getDocument("src/users.xml");				//根节点: 		Element root = document.getRootElement();				//获得根下的user: 第一个: 		Element userEle = root.element("user");				//获得school节点“: 		Element schooleEle = userEle.element("school");				//调用方法: 		schooleEle.setText("北京易动优优科技有限公司");				// 		Dom4JUtil.write2File(document, "src/users.xml");	}		//实现元素指定位置的添加操作:  在wangao 的 age 前加: 
燕理
@Test public void testinsertBefore() throws Exception { /* * 1: 获得文档: * 2: 获得根节点: * 3: 获得根节点下的王ao的节点: user * 4: 获得user下的所有的子节点: elements(); List(); * 5: 创建一个新的节点: user.addElement(); 末尾情况在末尾: 使用此方式: * 使用工具类: DocumentHelper 能够创建一个游离的节点: * 6: 将游离的节点放在集合指定位置当中: * 7: 回写: */ //使用工具类获得文档: Document document = Dom4JUtil.getDocument("src/users.xml"); //根节点: Element root = document.getRootElement(); //获得根下的user: 第一个: Element userEle = root.element("user"); //获得userEle下的所有的子节点: List
list = userEle.elements(); //创建一个新的元素: 使用工具类: DocumentHelper: Element schoolEle = DocumentHelper.createElement("school"); schoolEle.addText("燕理"); //将创建的节点 放在集合指定的位置当中: list.add(1,schoolEle); //回写: Dom4JUtil.write2File(document, "src/users.xml"); } //实现元素节点的删除操作: @Test public void testDelete() throws Exception { //使用工具类获得document文档对象: Document document = Dom4JUtil.getDocument("src/users.xml"); //获得根节点: Element root = document.getRootElement();// users //4:获得根节点下要删除的节点: Element userEle = root.element("user");//获得xml当中的第一个user对象: List
gendersEles = userEle.elements("gender");//获得了user下的所有的gender对象: //6:父节点执行删除操作: for(int i=0; i

二: XPath: 表达式:

xpath的描述: 不是dom4J 提供的。 第三方组织提供:

但是dom4J 支持Xpath表达式:

1: 作用: 能够快速的定位标签

因为有时候标签的层级比较深 不好找。

2: 使用:

导入jar包:

3: xpath 表达式的编写: 表达式本质上就是一个字符串类型:

example1: /AAA/DDD/BBB 绝对路径:
example2: //DDD/BBB 后的DDD 下的所有的bbb
example3: /AAA/CCC/DDD/* *代表所有
example4: /AAA/BBB[1] [num] [last()]
example5: //BBB[@name]
example6:

String xpath =" //AAA//DDD//BBB";

4: dom4J如何支持xpath的呢?

selectNodes( "//foo/bar" ); 所有多个元素:   selectSingleNode(); //获得单个元素:  这两个方法返回值是Node

如果需要获得element,则强转即可。

如图:
在这里插入图片描述

//练习: 查询students 当中所有的name属性对应的值:

package com.yidongxueyuan.xpath;import java.util.List;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.Node;import org.junit.Test;import com.yidongxueyuan.util.Dom4JUtil;public class XpathDemo {		//获得指定的name : 对应的值: 	@Test	public void testname3() throws Exception {		//获得文档: 		Document document = Dom4JUtil.getDocument("src/users.xml");				String xpath ="/users/user[last()]/name";//		String xpath="//name[@id='1001']";				Node node = document.selectSingleNode(xpath);		String text = node.getText();		System.out.println(text);	}		//查询user.xml当中name标签对应的值: 	@Test	public void testname2() throws Exception {				//获得文档: 		Document document = Dom4JUtil.getDocument("src/users.xml");				//定义一个xpath表达式:		String xpath ="//name";		List
list = document.selectNodes(xpath); //student for(int i=0; i
list = document.selectNodes(xpath); //student for(int i=0; i

转载地址:http://bwqen.baihongyu.com/

你可能感兴趣的文章
《数学之美》知识点详细总结
查看>>
机器学习 数据挖掘 数据集划分 训练集 验证集 测试集
查看>>
从不同角度看机器学习的几种学习方式
查看>>
数据挖掘 NLP 之 文本挖掘 文本处理 通用流程
查看>>
NLP 主题抽取 Topic LDA代码实践 gensim包 代码
查看>>
NLP 工具包 大调查 自然语言处理工具包合集
查看>>
scrapy爬取酒店评论数据
查看>>
各框架下(tensorflow, pytorch, theano, keras)实现几个基础结构神经网络(mlp, autoencoder, CNNs, recurrent, recursive)
查看>>
软考相关英语
查看>>
[老老实实学WCF] 第四篇 初探通信--ChannelFactory
查看>>
ASP.NET 中的 Async/Await 简介
查看>>
解决Chrome中调试JS提示“Uncaught TypeError: Cannot use 'in' operator to search for”错误信息问题
查看>>
阿里巴巴java规范 第一版
查看>>
USB通信记事
查看>>
Android 编译(1)——Android编译步骤梳理
查看>>
编译器配置(1)——ARMv7,ARMv8(AArch64) 浮点配置等相关知识
查看>>
RK3399 OV13850摄像头配置
查看>>
Android 编译(2)——jack-server相关问题
查看>>
网络服务(2)——以太网配置IPV4和IPV6
查看>>
网络服务(3)——以太网phy的识别加载(RK3399)
查看>>