1 dom4j介绍

dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包, Hibernate用它来读写配置文件。

dom4j主要接口都在org.dom4j这个包里定义:

Attribute Attribute定义了XML的属性

Branch Branch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为,

CDATA CDATA 定义了XML CDATA 区域

CharacterData CharacterData是一个标识借口,标识基于字符的节点。如CDATA,Comment, Text.

Comment Comment 定义了XML注释的行为

Document 定义了XML文档

DocumentType DocumentType 定义XML DOCTYPE声明

Element Element定义XML 元素

ElementHandler ElementHandler定义了 Element 对象的处理器

ElementPath 被 ElementHandler 使用,用于取得当前正在处理的路径层次信息

Entity Entity定义 XML entity

Node Node为所有的dom4j中XML节点定义了多态行为

NodeFilter NodeFilter 定义了在dom4j节点中产生的一个滤镜或谓词的行为(predicate)

ProcessingInstruction ProcessingInstruction 定义 XML 处理指令.

Text Text 定义XML 文本节点.

Visitor Visitor 用于实现Visitor模式.

XPath XPath 在分析一个字符串后会提供一个XPath 表达式

2 使用dom4j创建xml文档

Document document = DocumentHelper.createDocument();

通过这句定义一个XML文档对象。

Element root = document.addElement("根节点名称");

通过这句定义一个XML元素,这里添加的是根节点。

Element有几个重要的方法:

addComment : 添加注释

addAttribute : 添加属性

addElement : 添加子元素

最后通过XMLWriter生成物理文件,默认生成的XML文件排版格式比较乱,可以通过OutputFormat类格式化输出,默认采用createCompactFormat()显示比较紧凑,最好使用createPrettyPrint()。

实例代码

1 package cn.mars.app.txn.whpf;

2

3 import java.io.FileOutputStream;

4

5 import org.dom4j.Attribute;

6 import org.dom4j.Document;

7 import org.dom4j.DocumentHelper;

8 import org.dom4j.Element;

9 import org.dom4j.io.OutputFormat;

10 import org.dom4j.io.XMLWriter;

11

12 public class Dom4jTest {

13

14 public static void main(String[] args) {

15 // 创建文档。

16 Document document = DocumentHelper.createDocument();

17 // 设置文档DocType,这里为了举例,添加hibernate的DocType

18 document.addDocType("hibernate-configuration", "-//Hibernate/Hibernate Configuration DTD 3.0//EN",

19 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd");

20 // 文档增加节点,即根节点,一个文档只能有一个根节点,多加出错

21 Element root = document.addElement("skills");

22 // 添加注释

23 root.addComment("第一个技能");

24 // 根节点下添加节点

25 Element first = root.addElement("skill");

26 // 节点添加属性

27 first.addAttribute("name", "独孤九剑");

28 // 节点下添加节点

29 Element info = first.addElement("info");

30 // 节点设置内容数据

31 info.setText("为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。");

32

33 // 同理增加其他节点,内容,属性等

34 Element second = root.addElement("skill");

35 second.addAttribute("name", "葵花宝典");

36 Element info2 = second.addElement("info");

37 info2.setText("宦官所创,博大精深,而且凶险至极。练宝典功夫时,首先要自宫净身。");

38

39 // 创建节点

40 Element third = DocumentHelper.createElement("skill");

41 // 将节点加入到根节点中

42 root.add(third);

43 // 创建属性,第一个参数指定了拥有者,也可以为null,指定拥有者

44 Attribute name = DocumentHelper.createAttribute(third, "name", "北冥神功");

45 // 将属性加入到节点上

46 third.add(name);

47 // 创建子节点并加入到节点中

48 Element info3 = DocumentHelper.createElement("info");

49 info3.setText("逍遥派的顶级内功之一,能吸人内力转化为自己所有,威力无穷。");

50 third.add(info3);

51

52 try {

53 // 创建格式化类

54 OutputFormat format = OutputFormat.createPrettyPrint();

55 // 设置编码格式,默认UTF-8

56 format.setEncoding("UTF-8");

57 // 创建输出流,此处要使用Writer,需要指定输入编码格式,使用OutputStream则不用

58 FileOutputStream fos = new FileOutputStream("d:/skills.xml");

59 // 创建xml输出流

60 XMLWriter writer = new XMLWriter(fos, format);

61 // 生成xml文件

62 writer.write(document);

63 writer.close();

64 } catch (Exception e) {

65 e.printStackTrace();

66 }

67 }

68 }

输出文件内容:

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

2

3

4

5

6

7 为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。

8

9

10 宦官所创,博大精深,而且凶险至极。练宝典功夫时,首先要自宫净身。

11

12

13 逍遥派的顶级内功之一,能吸人内力转化为自己所有,威力无穷。

14

15

3 使用dom4j解析xml文件

3.1 构建dom4j树

org.dom4j.io提供了两个类:SAXReader和DOMReader,DOMReader只能一个现有的w3c DOM树构建dom4j树,即只能从一个org.w3c.dom.Document中构建org.dom4j.Document树,而SAXReader则使用SAX解析器,从不同的输入源构建dom4j树,如可以从xml文件中读取并构建dom4j树。

实例代码:使用SAXReader解析

1 SAXReader reader = new SAXReader();

2 Document document = reader.read(new File("d:/skills.xml"));

实例代码:使用DOMReader解析

1 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

2 DocumentBuilder db = dbf.newDocumentBuilder();

3 File file = new File("d:/skills.xml");

4 org.w3c.dom.Document domDocument = db.parse(file);

5 DOMReader reader = new DOMReader();

6 org.dom4j.Document document = reader.read(domDocument);

3.2 获取节点

获得dom4j树之后,可以根据dom4j树获取节点。首先获取根节点,然后根据根节点获取其子节点。

实例代码:访问根节点

1 Element root = document.getRootElement();

实例代码:访问所有子节点

List skills = root.elements();

for (Iterator> it = skills.iterator(); it.hasNext();) {

Element e = (Element) it.next();

}

实例代码:访问指定名称的节点,如访问名称为“skill”的全部节点

1 List skills = root.elements("skill");

2 for (Iterator> it = skills.iterator(); it.hasNext();) {

3 Element e = (Element) it.next();

4 //TODO

5 }

实例代码:访问指定名称的第一个节点

1 Element skill = root.element("skill");

实例代码:迭代某个元素的所有子元素,如迭代root

1 for(Iterator it = root.elementIterator();it.hasNext();){

2 Element e = it.next();

3 //TODO

4 }

3.3 获取属性

获取节点后,可以根据节点获取属性,获得方式与获取节点类似。

实例代码:获取指定名称的元素

1 Element skill = root.element("skill");

2 Attribute attr1 = skill.attribute("name");

实例代码:按照属性顺序获取属性

1 Element skill = root.element("skill");

2 Attribute attr2 = skill.attribute(0);

实例代码:获取某节点下全部属性1

1 Element skill = root.element("skill");

2 List list = skill.attributes();

3 for (Iterator it = list.iterator(); it.hasNext();) {

4 Attribute attr = it.next();

5 // TODO

6 }

实例代码:获取某节点下全部属性2

1 Element skill = root.element("skill");

2 for (Iterator it = skill.attributeIterator(); it.hasNext();) {

3 Attribute attr = it.next();

4 // TODO

5 }

3.4 使用XPath获取节点和属性

Dom4j 中集成了对XPath的支持。在选择节点时,可以直接使用XPath 表达式。这种方式更加方便,简洁,官方文档中推荐使用该种方式。

实例代码:要选择所有的元素的name属性

1 List list = document.selectNodes("//skills/skill/@name");

2 for (Iterator it = list.iterator(); it.hasNext();) {

3 Attribute attr = (Attribute) it.next();

4 //TODO

5 }

注意:为了能够编译执行上述使用XPath表达式的代码,需要配置dom4j 安装包中自带的jaxen包,你也可以从http://sourceforge.net/products/jaxen/上下载jaxen。jaxen是 一个用java开发的XPath引擎,用于配合各种基于XML的对象模型,如DOM,dom4j和JDOM。在dom4-1.6.1 目录下,有一个lib 子目录,其中有个jaxen-1.1-beta-6.jar文件,需要在classpath环境变量中配置该文件的全路径名。

4 使用dom4j修改xml文件

修改xml文件,需要先获取dom4j树(即Document),通常欲修改节点需要先获得该节点或其父节点,欲修改属性,需要先获得该属性所在的节点和该属性。

增加操作:参照前文。

删除操作:

实例代码:删除某节点

1 Element root = document.getRootElement();

2 Element skill = root.element("skill");

3 root.remove(skill);

实例代码:删除指定名称的属性

1 Element skill = root.element("skill");

2 skill.remove(skill.attribute("name"));

修改操作:

实例代码:修改节点名称和节点值

1 Element skill = root.element("skill");

2 skill.setName("new_skill");

3 skill.setText("你好");

实例代码:修改属性值

1 Attribute attr = skill.attribute("name");

2 attr.setText("newName");

属性名称无法修改,欲修改属性名称,可以先删除旧属性,再增加新属性

5 常用方法

5.1 Element元素API

getQName() 元素的QName对象

getNamespace() 元素所属的Namespace对象

getNamespacePrefix() 元素所属的Namespace对象的prefix

getNamespaceURI() 元素所属的Namespace对象的URI

getName() 元素的local name

getQualifiedName() 元素的qualified name

getText() 元素所含有的text内容,如果内容为空则返回一个空字符串而不是null

getTextTrim() 元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回null

attributeIterator() 元素属性的iterator,其中每个元素都是Attribute对象

attributeValue() 元素的某个指定属性所含的值

elementIterator() 元素的子元素的iterator,其中每个元素都是Element对象

element() 元素的某个指定(qualified name或者local name)的子元素

elementText() 元素的某个指定(qualified name或者local name)的子元素中的text信息

getParent 元素的父元素

getPath() 元素的XPath表达式,其中父元素的qualified name和子元素的qualified name之间使用"/"分隔

isTextOnly() 是否该元素只含有text或是空元素

isRootElement() 是否该元素是XML树的根节点

5.2 Attribute属性API

getQName() 属性的QName对象

getNamespace() 属性所属的Namespace对象

getNamespacePrefix() 属性所属的Namespace对象的prefix

getNamespaceURI() 属性所属的Namespace对象的URI

getName() 属性的local name

getQualifiedName() 属性的qualified name

getValue() 属性的值

5.3 字符串转化

实例代码:把节点,属性,文档等转化成字符串,使用asXML()方法。

1 String docXmlText = document.asXML();

2 String rootXmlText = root.asXML();

实例代码:把字符串转换为文档,注意引号需要转义

1 String skillString = "神龙摆尾";

2 Document d = DocumentHelper.parseText(skillString);

5.4 命名空间(Namespace)操作

dom4j的名称空间信息api常用的方法有8个。

dom4j在Element和Attribute 接口中定义了获取名称空间信息的方法,这些方法和JDOM中的方法相同。如下所示:

public java.lang.String getNamespacePrefix()该方法返回元素(属性)的名称空间前缀

public java.lang.String getNamespaceURI()该方法返回元素(属性)的名称空间

URIpublic java.lang.String getName()该方法返回元素(属性)的本地名

public java.lang.String getQualifiedName()该方法返回元素(属性)的限定名

public Namespace getNamespace()该方法返回元素本身的名称空间

public java.util.List additionalNamespaces()返回某元素上附加的名称空间声明列表,列表中的每一个对象都是Namespace类型。

这个类的方法提供了两个方法分别获得名称空间前缀和本地名。如下:

public java.lang.String getPrefix()该方法返回名称空间前缀。

public java.lang.String getURI()该方法返回名称空间的URI。

6 Qname介绍

Qname在使用dom4j的时候,经常见到,一般自己解析的xml很少使用这种复杂格式。

1. 来历:qname是qualified name的简写

2. 构成:由名字空间(namespace)前缀(prefix)以及冒号(:),还有一个元素名称构成

3. 举例:

1

2 xmlns="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"

3 version="1.0">

4

5


6

7

xsl是名字空间前缀,template是元素名称,xsl:template 就是一个qname。

4.总结:qname无非是有着特定格式的xml元素,其作用主要是增加了名字空间,比如有同样的元素名称,而名字空间不同的情况。

dom4j java_DOM4J相关推荐

  1. 利用dom4j将实体类转换为对应的xml报文

    利用dom4j生成xml报文 目标格式: <?xml version="1.0" encoding="GBK"?><Packet type=& ...

  2. 使用Dom4j操作XML数据

    --------------siwuxie095 dom4j 是一个非常优秀的 Java XML 的 API, 用来读写 XML 文件 和操作 XML 数据 特点:性能优异.功能强大.极端易用 dom ...

  3. 使用dom4j解析XML例子

    包括三个文件:studentInfo.xml(待解析的xml文件), Dom4jReadExmple.java(解析的主要类), TestDom4jReadExmple.java(测试解析的结果) 代 ...

  4. dom4j读写xml文件

    dom4j读写xml文件 首先我们给出一段示例程序: import java.io.File; import java.io.FileWriter; import java.util.Iterator ...

  5. Java XML解析工具 dom4j介绍及使用实例

    Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...

  6. JavaWeb学习笔记——DOM4J

    下载的地址为:http://www.dom4j.org/dom4j-1.6.1/ import java.io.File; import java.io.FileOutputStream; impor ...

  7. java dom4 引入_java – 使用dom4j从节点获取属性值

    我的 XML结构类似于下面的示例.我正在尝试使用dom4j从XML中获取属性值. 目前,节点使用以下代码存储到List中: public List getFoo() { String FOO_XPAT ...

  8. java xml dom4j 解析_在JAVA中怎么用DOM和DOM4j解析XML啊?

    二.XML文件 三.开始解析 public class JDOMTest { public static void main(String[] args) { // 进行对books.xml文件的JD ...

  9. 【学习笔记】关于DOM4J:使用DOM4J解析XML文档

    一.概述 DOM4J是一个易用的.开源的库,用于XML.XPath和XSLT中.采用了Java集合框架并完全支持DOM.SAX.和JAXP. DOM4J最大的特色是使用大量的接口,主要接口都在org. ...

最新文章

  1. 阿里大佬告诉你,支付宝的架构到底有多牛逼!还没看完我就跪了!
  2. 刘知远:近年来开源的算法代码、工具包列表
  3. 关于http://127.0.0.1:4723/wd/hub的解释
  4. tomcat端口号被占用
  5. 泛亚凭借一粒薏米-农业大健康·田亚:对话农民丰收节交易会
  6. HNOI2018酱油记
  7. WebSoket 的广泛应用
  8. 51nod1667-概率好题【容斥,组合数学】
  9. ubuntu安装wine之后进不了系统
  10. JSP自定义标签由浅到深讲解
  11. ASP.NET 1.1与ASP.NET 2.0 应用运行并存
  12. ioprofile mysql_使用pt-ioprofile对MySQL作IO剖析
  13. 【转】SVN中的Branches分支以及Tags标签详解与应用举例
  14. 公司里面用的iTextSharp(教程)---关于PDF的属性设置
  15. foreach php 多重数组,PHP的foreach与多维数组
  16. visio绘制自定义图形(完全零基础)
  17. web中常用的20种字体 (share)
  18. c#在线考试系统参考文献(精选100个)
  19. Android CameraX 使用入门
  20. 插入法、选择法、冒泡法(C++实现)

热门文章

  1. 云计算 python(零基础2)
  2. 给 element-ui 表格的表头添加icon图标
  3. 数学建模学习笔记(二):非线性规划模型例题与灵敏度分析
  4. 单例模式实现居民身份证
  5. Zemax操作17--非球面准直镜
  6. java毕业设计校园招聘论坛设计mybatis+源码+调试部署+系统+数据库+lw
  7. PHP 导入和导出 Excel表格
  8. 2021年腾讯最新面试题,一个小时帮你掌握面试精髓!看过百分之99能拿到腾讯offer~
  9. 【红外DDE算法】一种应用于高动态范围红外可视化的算法
  10. 有朋自远方来.....