文档章节

常用框架(Dom4j)

pmos
 pmos
发布于 2016/07/27 11:47
字数 1494
阅读 31
收藏 0

常用框架(Dom4j)

1、XML

基本的定义

xml是一种标记语言
//标准的html,html是xml的一个子集
<html>
  <head><title>标题</title></head>
  <body>
  </body>
</html>

//标准的xml,xml可以任意定义元素
<books>
  <book>
    <id></id>
    <title></title>
    <author></author>
  </book>
</books>

//不合法的xml,xml不能出现循环嵌套
<id>
  <head>
</id>
  </head>

//也是不合法的,xml必须有结束
<id><head></id>

//合法的,节点可以自结束
<id>
  <head/>
</id>

<book id="1">  //id表示的是book的属性(Attribute)--book是一个节点(Node|Element)
  <title>java编程思想</title>  //title也是一个Node,java编程思想 也是一个Node(文本节点)
</book>

使用XML可以有效的实现对象到字符串的转换

public class Book {
	private int id;
	private String title;
	private String author;
	private double price;


Book b = new Book();
b.setId(Integer.parseInt(ele.attributeValue("id")));
b.setTitle(ele.elementText("title"));
b.setAuthor(ele.elementText("author"));
b.setPrice(Double.parseDouble(ele.elementText("price")));


<book id="1">
   <title>Java编程思想</title>
   <author>Bruce Eckel</author>
   <price>69.00</price>
</book>

基于Java处理XML

dom4j-->不是j2se所自带的,需要通过网络下载这个文件包才能使用。

dom4j的安装

1、下载dom4j

对于所有的基于java的第三方工具,下载的地点只有一个选择:官方网站。

下载的选择:版本选择

xxx-1.6.0-SNAPSHOT.jar(快照版本,内部都没有经过测试的版本)

xxx-alpha.jar(表示的alpha版本,这种版本表示内部测试版)

xxx-beta.jar(内部测试已经完成,外部测试版本)

以上版本可以在学习的时候使用,但是绝对不能用于正式的项目。

xxx-release.jar(已经发布的版本)

xxx-GA.jar(完全稳定版本)

release和GA的版本是可以直接使用的版本。

2、将jar包添加到环境变量

常用的方式

1、在项目中创建一个Folder(建议的名称就是lib)

2、将dom4j中的lib中的文件和dom4j.jar拷贝到这个lib中

3、将这些文件添加到buildpath中

如果出现以下就表示添加成功

3、写一个类测试dom4j

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;

public class Test01 {
	public static void main(String[] args) {
		try {
			SAXReader reader = new SAXReader();
			Document d = reader.read(new File("d:/test/test.xml"));
			System.out.println(d);
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
}

这一步不是必须的,但是建议引入

1、按住ctrl点击某个类

2、点击Attach Source

基于Dom4j的操作

获取类路径下的文件

		File f = new File("books.xml");
		//因为在不同的包中,所以无法找到
		System.out.println(f.exists());
		/*
		 * 要获取类路径下的文件可以通过类.class.getResource("文件名")
		 */
		URL url = Test02.class.getResource("books.xml");
		//根据url获取完整的路径
		System.out.println(url.getPath());
		f = new File(url.getPath());
		System.out.println(f.exists());

对于XML文档的基本访问

		try {
			SAXReader reader = new SAXReader();
			//获取xml包中的books.xml
			Document d = reader.read(TestXML03.class
					.getResourceAsStream("xml/books.xml"));
			//获取根元素
			Element re = d.getRootElement();
			System.out.println("root:"+re.getName());
			//并不是null,而是一组空字符串
			System.out.println(re.elementText("book"));
			//获取root的所有子节点
			List<Element> eles = re.elements();
			for(Element ele:eles) {
				//System.out.println(ele.getName());
				//获取属性为id的值
				System.out.println(ele.attributeValue("id"));
				//获取某个特定子节点中的元素的文本值
				System.out.println(ele.elementText("title")+":"+ele.elementText("price"));
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}

基于XPath的访问

			SAXReader reader = new SAXReader();
			Document d = reader.read(TestXPath.class.getResource("xml/books.xml"));
			Element root = d.getRootElement();
			/**
			 * 相对路径查找,从当前节点查找子节点book
			 */
			List<Element> eles = root.selectNodes("book");
			System.out.println(eles);
			/**
			 * 使用绝对路径来查找,从根books节点查找book节点(此时不会去查找book下的子节点)
			 */
			eles = root.selectNodes("/books/book");
			System.out.println(eles.size()+":"+eles);
			/**
			 * 根节点不是book,所以无法查找
			 */
			eles = root.selectNodes("/book");
			System.out.println(eles.size()+":"+eles);
			/**
			 * 表示从文档中遍历所有满足要求的节点(从根节点开始)
			 * 不太建议使用,因为效率不高
			 */
			eles = root.selectNodes("//title");
			System.out.println(eles.size()+":"+eles);
			/**
			 * 查找了所有作者为Bruce Eckel的书
			 */
			//author:节点下的元素节点
			eles = root.selectNodes("/books/book[author='Bruce Eckel']");
			for(Element e:eles) {
				System.out.println(e.elementText("title"));
			}
			System.out.println("--------------------------------------------");
			/**
			 * 查找了属性中id大于等于2的书
			 */
			//使用@可以遍历属性节点的值
			eles = root.selectNodes("/books/book[@id>=2]");
			for(Element e:eles) {
				System.out.println(e.elementText("title"));
			}
			/**
			 * 查找名称中包含有java的price节点
			 */
			// /price得到的是price节点而不是book节点
			//contains(title,'java'):xpath的函数,第一个参数不加引号
			//因为是xml中的节点名称,第二个加引号表示是一个比较的字符串
			eles = root.selectNodes("/books/book[contains(title,'java')]/price");
			for(Element e:eles) {
				System.out.println(e.getTextTrim());
			}
			System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
			/**
			 * 查找名称中包含有java并且价格小于50的书
			 */
			eles = root.selectNodes("/books/book[contains(title,'java') and price<50]");
			for(Element e:eles) {
				System.out.println(e.elementText("title")+":"+e.elementText("price"));
			}

向xml中写数据

1、创建Document

			//写数据首先要创建一个document对象
			Document d = DocumentHelper.createDocument();

2、添加元素

			//为d添加节点,并且返回该节点
			Element root = d.addElement("users");
			//为根节点添加节点,并且返回添加的节点
			Element eu = root.addElement("user");
			//添加属性
			eu.addAttribute("id", "1");
			//添加username和password两个节点
			eu.addElement("username").addText("张三");
			eu.addElement("password").addText("123456");
			eu = root.addElement("user");
			eu.addAttribute("id", "2");
			eu.addElement("username").addText("李四");
			eu.addElement("password").addText("2222222");

3、创建XMLWriter

			//获取xml文件所在的路径
			String path = TestWrite2XML.class.getResource("xml/users.xml").getPath();
			//在学习时可以使用这种方法
			//会默认修改bin下的文件,将路径从bin替换成src
			path = path.replace("bin", "src");
			//创建XMLWriter来写数据
			out = new XMLWriter(new FileWriter(path),OutputFormat.createPrettyPrint());

4、通过XMLWriter写数据

			//将节点写到xml文档中
			out.write(d);

完整代码

		XMLWriter out = null;
		try {
			//写数据首先要创建一个document对象
			Document d = DocumentHelper.createDocument();
			//为d添加节点,并且返回该节点
			Element root = d.addElement("users");
			//为根节点添加节点,并且返回添加的节点
			Element eu = root.addElement("user");
			//添加属性
			eu.addAttribute("id", "1");
			//添加username和password两个节点
			eu.addElement("username").addText("张三");
			eu.addElement("password").addText("123456");
			eu = root.addElement("user");
			eu.addAttribute("id", "2");
			eu.addElement("username").addText("李四");
			eu.addElement("password").addText("2222222");
			//获取xml文件所在的路径
			String path = TestWrite2XML.class.getResource("xml/users.xml").getPath();
			//在学习时可以使用这种方法
			//会默认修改bin下的文件,将路径从bin替换成src
			path = path.replace("bin", "src");
			//创建XMLWriter来写数据
			out = new XMLWriter(new FileWriter(path),OutputFormat.createPrettyPrint());
			//将节点写到xml文档中
			out.write(d);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//需要关闭XMLWriter
			try {
				if(out!=null) out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}

 

© 著作权归作者所有

pmos
粉丝 12
博文 128
码字总数 213664
作品 0
其它
项目经理
私信 提问
DOM4J解析XML

Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。很多Java软件读写XML都在使用dom4j,Sun公司的JAXM也是用dom4j。Hib...

iborder
2016/10/18
88
0
dom4j 2.0.1 发布,XML 操作库

dom4j 2.0.1 已发布,该版本主要是修复了 bug,详细如下: 修复 QName 序列化 (#17) DocumentException 初始化出现 nested exception (#20) 多线程测试中意外发生的错误 (#14) 下载地址 dom4...

淡漠悠然
2017/07/06
1K
22
XML的4中解析速率分析

JUnit是Java提供的一种进行单元测试的自动化工具。测试方法可以写在任意类中的任意位置。使用JUnit可以没有main()入口进行测试。 DOM4J在灵活性和对复杂xml的支持上都要强于DOM DOM4J的应用范...

Favour
2016/05/26
3
0
XML生成和解析

1、DOM方式解析XML 给予DOM的解析方式,是把整个XML文档加载到内存,转化成DOM树,可以随机的访问DOM树的任何数据,速度快、比较灵活,但是消耗资源比较多,不适用大的xml文档解析,测试超过...

祁猛
2016/10/19
34
0
Dom4j 2.0.0 RC1 发布,XML 操作库

Dom4j 2.0.0 RC1 发布下载,暂未找到相关说明。 下载:dom4j-1.6.1.tar.gz (9.7 MB)。 Dom4j 是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支...

淡漠悠然
2015/07/20
1K
5

没有更多内容

加载失败,请刷新页面

加载更多

VMware vSphere ESXi主机的访问控制

在vShpere中,访问ESXi主机的途径很多,如下: ESXi DCUI ESXi Shell ESXi SSH ESXi Host Client vCenter --> vSphere web client / vSphere Client VMware vSphere ESXi主机的访问控制,除了......

大别阿郎
20分钟前
2
0
大神讲解CGI、FastCGI和PHP-FPM关系图解

参考资料 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM:http://www.nowamagic.net/librarys/veda/detail/1319 php中fastcgi和php-fpm是什么东西:https://www.zybuluo.com/phper/note/50231 ......

网络小虾米
29分钟前
2
0
《DNS攻击防范科普系列3》 -如何保障 DNS 操作安全

引言 前两讲我们介绍了 DNS 相关的攻击类型,以及针对 DDoS 攻击的防范措施。这些都是更底层的知识,有同学就来问能否讲讲和我们的日常操作相关的知识点,今天我们就来说说和我们日常 DNS 操...

Mr_zebra
30分钟前
2
0
zk中ServerCnxn

实现接口Stats, Watcher 内部类 DisconnectReason CloseRequestException EndOfStreamException(流关闭) 属性 方法 getSessionTimeout 获取session失效时间 sendResponse 发送回复数据 se......

writeademo
35分钟前
3
0
如何将 Redis 用于微服务通信的事件存储

来源:Redislabs 作者:Martin Forstner 翻译:Kevin (公众号:中间件小哥) 以我的经验,将某些应用拆分成更小的、松耦合的、可协同工作的独立逻辑业务服务会更易于构建和维护。这些服务(也...

中间件小哥
38分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部