转:http://blog.csdn.net/icecloud/article/details/7795
DOM4J
是
dom4j.org
出品的一个开源
XML
解析包,它的网站中这样定义:
Dom4j
is an easy to use, open source library for working with XML, XPath and
XSLT on the Java platform using the Java Collections Framework and with
full support for DOM, SAX and JAXP.
Dom4j
是一个易用的、开源的库,用于
XML
,
XPath
和
XSLT
。它应用于
Java
平台,采用了
Java
集合框架并完全支持
DOM
,
SAX
和
JAXP
。
DOM4J
使用起来非常简单。只要你了解基本的
XML-DOM
模型,就能使用。然而他自己带的指南只有短短一页(
html
),不过说的到挺全。国内的中文资料很少。因而俺写这个短小的教程方便大家使用,这篇文章仅谈及基本的用法,如需深入的使用,请
……
自己摸索或查找别的资料。
之前看过
IBM developer
社区的文章(参见附录),提到一些
XML
解析包的性能比较,其中
DOM4J
的性能非常出色,在多项测试中名列前茅。(事实上
DOM4J
的官方文档中也引用了这个比较)所以这次的项目中我采用了
DOM4J
作为
XML
解析工具。
在国内比较流行的是使用
JDOM
作为解析器,两者各擅其长,但
DOM4J
最大的特色是使用大量的接口,这也是它被认为比
JDOM
灵活的主要原因。大师不是说过么,
“
面向接口编程
”
。目前使用
DOM4J
的已经越来越多。如果你善于使用
JDOM
,不妨继续用下去,只看看本篇文章作为了解与比较,如果你正要采用一种解析器,不如就用
DOM4J
吧。
它的主要接口都在
org.dom4j
这个包里定义:
看名字大致就知道它们的涵义如何了。
要想弄懂这套接口,关键的是要明白接口的继承关系:
一目了然,很多事情都清楚了。大部分都是由
Node
继承来的。知道这些关系,将来写程序就不会出现
ClassCastException
了。
下面给出一些例子(部分摘自
DOM4J
自带的文档),简单说一下如何使用。
1.
读取并解析
XML
文档:
读写
XML
文档主要依赖于
org.dom4j.io
包,其中提供
DOMReader
和
SAXReader
两类不同方式,而调用方式是一样的。这就是依靠接口的好处。
//
从文件读取
XML
,输入文件名,返回
XML
文档
public
Document
read(String
fileName)
throws
MalformedURLException,
DocumentException
{
SAXReader
reader
=
new
SAXReader();
Document
document
=
reader.read(
new
File(fileName));
return
document;
}
|
其中,
reader
的
read
方法是重载的,可以从
InputStream, File, Url
等多种不同的源来读取。得到的
Document
对象就带表了整个
XML
。
根据本人自己的经验,读取的字符编码是按照
XML
文件头定义的编码来转换。如果遇到乱码问题,注意要把各处的编码名称保持一致即可。
2.
取得
Root
节点
读取后的第二步,就是得到
Root
节点。熟悉
XML
的人都知道,一切
XML
分析都是从
Root
元素开始的。
public
Element
getRootElement(Document
doc){
return
doc.getRootElement();
}
|
3.
遍历
XML
树
DOM4J
提供至少
3
种遍历节点的方法:
1)
枚举
(Iterator)
//
枚举所有子节点
for
(
Iterator
i
=
root.elementIterator();
i.hasNext();
)
{
Element
element
=
(Element)
i.next();
// do something
}
//
枚举名称为
foo
的节点
for
(
Iterator
i
=
root.elementIterator(
foo
);
i.hasNext();)
{
Element
foo
=
(Element)
i.next();
// do something
}
//
枚举属性
for
(
Iterator
i
=
root.attributeIterator();
i.hasNext();
)
{
Attribute
attribute
=
(Attribute)
i.next();
// do something
}
|
2)
递归
递归也可以采用
Iterator
作为枚举手段,但文档中提供了另外的做法
public
void
treeWalk()
{
treeWalk(getRootElement());
}
public
void
treeWalk(Element
element)
{
for
(
int
i
=
0,
size
=
element.nodeCount();
i
<
size;
i++)
{
Node
node
=
element.node(i);
if
(node
instanceof
Element)
{
treeWalk((Element)
node);
}
else
{
// do something....
}
}
}
|
3) Visitor
模式
最令人兴奋的是
DOM4J
对
Visitor
的支持,这样可以大大缩减代码量,并且清楚易懂。了解设计模式的人都知道,
Visitor
是
GOF
设计模式之一。其主要原理就是两种类互相保有对方的引用,并且一种作为
Visitor
去访问许多
Visitable
。我们来看
DOM4J
中的
Visitor
模式
(
快速文档中没有提供
)
只需要自定一个类实现
Visitor
接口即可。
public
class
MyVisitor
extends
VisitorSupport
{
public
void
visit(Element
element){
System.out.println(element.getName());
}
public
void
visit(Attribute
attr){
System.out.println(attr.getName());
}
}
调用:
root.accept(new MyVisitor())
|
Visitor
接口提供多种
Visit()
的重载,根据
XML
不同的对象,将采用不同的方式来访问。上面是给出的
Element
和
Attribute
的简单实现,一般比较常用的就是这两个。
VisitorSupport
是
DOM4J
提供的默认适配器,
Visitor
接口的
Default Adapter
模式,这个模式给出了各种
visit(*)
的空实现,以便简化代码。
注意,这个
Visitor
是自动遍历所有子节点的。如果是
root.accept(MyVisitor)
,将遍历子节点。我第一次用的时候,认为是需要自己遍历,便在递归中调用
Visitor
,结果可想而知。
4. XPath
支持
DOM4J
对
XPath
有良好的支持,如访问一个节点,可直接用
XPath
选择。
public
void
bar(Document
document)
{
List
list
=
document.selectNodes(
//foo/bar
);
Node
node
=
document.selectSingleNode(
//foo/bar/author
);
String
name
=
node.valueOf(
@name
);
}
|
例如,如果你想查找
XHTML
文档中所有的超链接,下面的代码可以实现:
public
void
findLinks(Document
document)
throws
DocumentException
{
List
list
=
document.selectNodes(
//a/@href
);
for
(Iterator
iter
=
list.iterator();
iter.hasNext();
)
{
Attribute
attribute
=
(Attribute)
iter.next();
String
url
=
attribute.getValue();
}
}
|
5.
字符串与
XML
的转换
有时候经常要用到字符串转换为
XML
或反之,
// XML
转字符串
Document
document
=
...;
String
text
=
document.asXML();
//
字符串转
XML
String
text
=
<person> <name>James</name> </person>
;
Document
document
=
DocumentHelper.parseText(text);
|
6
用
XSLT
转换
XML
public
Document
styleDocument(
Document
document,
String
stylesheet
)
throws
Exception
{
// load the transformer using JAXP
TransformerFactory
factory
=
TransformerFactory.newInstance();
Transformer
transformer
=
factory.newTransformer(
new
StreamSource(
stylesheet
)
);
// now lets style the given document
DocumentSource
source
=
new
DocumentSource(
document
);
DocumentResult
result
=
new
DocumentResult();
transformer.transform(
source,
result
);
// return the transformed document
Document
transformedDoc
=
result.getDocument();
return
transformedDoc;
}
|
7.
创建
XML
一般创建
XML
是写文件前的工作,这就像
StringBuffer
一样容易。
public
Document
createDocument()
{
Document
document
=
DocumentHelper.createDocument();
Element
root
=
document.addElement(
root
);
Element
author1
=
root
.addElement(
author
)
.addAttribute(
name
,
James
)
.addAttribute(
location
,
UK
)
.addText(
James Strachan
);
Element
author2
=
root
.addElement(
author
)
.addAttribute(
name
,
Bob
)
.addAttribute(
location
,
US
)
.
addText
(
Bob McWhirter
);
return
document;
}
|
8.
文件输出
一个简单的输出方法是将一个
Document
或任何的
Node
通过
write
方法输出
FileWriter
out
=
new
FileWriter(
foo.xml
);
document.write(out);
|
如果你想改变输出的格式,比如美化输出或缩减格式,可以用
XMLWriter
类
public
void
write(Document
document)
throws
IOException
{
//
指定文件
XMLWriter
writer
=
new
XMLWriter(
new
FileWriter(
output.xml
)
);
writer.write(
document
);
writer.close();
//
美化格式
OutputFormat
format
=
OutputFormat.createPrettyPrint();
writer
=
new
XMLWriter(
System.out,
format
);
writer.write(
document
);
//
缩减格式
format
=
OutputFormat.createCompactFormat();
writer
=
new
XMLWriter(
System.out,
format
);
writer.write(
document
);
}
|
如何,
DOM4J
够简单吧,当然,还有一些复杂的应用没有提到,如
ElementHandler
等。如果你动心了,那就一起来用
DOM4J.
DOM4J
官方网站:
(
我老连不上
)
http://www.dom4j.org
DOM4J
下载
(SourceForge)
,最新版本为
1.4
http://sourceforge.net/projects/dom4j
参考资料:
DOM4J
文档
Java
中的
XML
:
文档模型,第一部分:性能
http://www-900.ibm.com/developerWorks/cn/xml/x-injava/index.shtml
Java
中的
XML
:
Java
文档模型的用法
http://www-900.ibm.com/developerWorks/cn/xml/x-injava2/index.shtml
Java XML API
漫谈
by robbin
http://www.hibernate.org.cn:8000/137.html
分享到:
相关推荐
Termux (Android 5.0+).apk.cab
【资源说明】 基于go、vue开发的堡垒机系统(运维安全审计系统)全部资料+详细文档.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
制作报表
本项目为金山培训大作业源码汇总,采用C++与Qt技术构建,包含401个文件,涵盖106个C++源文件、72个头文件、41个PNG图片、27个项目文件以及HTML、JavaScript、CSS等多种文件类型。项目包含四个主要模块:KVector向量库、命令行会议系统、KSvg绘图板和KHttp音乐播放器。尽管最终未能入选,但展现了作者在C++编程和Qt框架应用方面的扎实功底和努力。
内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
【资源说明】 基于课程设计:C语言爬虫、详细文档+全部资料+高分项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
《自动控制原理》是自动化及相关专业的重要课程,涵盖了控制系统的基础理论和分析方法。这份资料集是针对杭州电子科技大学自动控制原理课程的期末复习资源,包含了试卷答案和复习PPT,对于学习者来说是一份非常宝贵的参考资料。 我们来看文件"9自控原理第五章习题参考答案.doc",它提供了第五章的习题解答。第五章通常涉及根轨迹法,这是分析线性系统稳定性的一种图形方法。通过绘制根轨迹,我们可以直观地理解系统动态性能的变化,例如系统的稳定性、超调量和调节时间等。 接着,"1第一章作业(答案).docx"涵盖了课程的初步概念,如控制系统的基本组成部分、控制系统的定义以及开环与闭环控制的区别。第一章的内容通常包括控制系统的基本模型,如传递函数和信号流图。 "10测试4.docx"和"13第7章测试.docx"可能是关于控制系统设计和分析的测试题目,可能涉及到频率响应分析或状态空间模型等内容。第七章常常讨论系统稳定性分析,比如奈奎斯特稳定判据或劳斯判据。 "7测试1.docx"可能包含有关拉普拉斯变换和控制系统动态特性的问题,这是控制系统分析的基础工具。 "4自动控制第二章习题答案.pdf"提供了第二章习题
066 - 直播逗大哥话术
AOP项目demo 案例
皮带输送线3D+2DCAD+加工件标准件清单BOMsw2016可编辑全套技术资料100%好用.zip
154-基于stm32单片机花样流水灯设计Proteus仿真+源程序.zip
鲸鱼WOA-XGboost拟合预测建模模型,数据格式多维自变量输入,单维因变量输出,直接替数据就可以使用,程序内注释详细
项目均经过测试,可正常运行! 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea
RocketDock-v1.3.5是一款专为Windows 7设计的桌面工具,它模仿Mac OS X的Dock功能,通过直观的图标排列提高应用启动效率。该工具提供快捷启动、动画效果、自定义设置以及扩展性,使用户能够根据个人喜好调整Dock栏并减少桌面杂乱。安装和设置过程简单,配有详细的说明文件,帮助用户更好地了解和使用工具。
会员制医疗预约服务管理信息系统的作用,可以提高会员制医疗预约服务管理的工作人员的效率,协助他们对会员制医疗预约服务信息进行统一管理,为管理者提供信息储存和查询搜索系统。一个良好的会员制医疗预约服务管理信息系统可以实现对会员制医疗预约服务的精细化管理:对在线会员制医疗预约服务管理流程的全过程进行电子化操作,其主要作用是管理和控制会员制医疗预约服务所有的信息,分析库存数据,使工作人员对会员制医疗预约服务管理信息系统进行监管,根据系统所提供的相应信息,采取适当的措施,及时补救管理中的漏洞,提高在线会员制医疗预约服务管理的工作效率,使得在线会员制医疗预约服务管理变的更加系统和规范。 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea
**CCNA(思科认证网络助理工程师)是网络技术领域中的一个基础认证,它涵盖了网络基础知识、IP编址、路由与交换技术等多个方面。以下是对CCNA中文版PPT中可能涉及的知识点的详细说明:** ### 第1章 高级IP编址 #### 1.1 IPv4地址结构 - IPv4地址由32位二进制组成,通常分为四段,每段8位,用点分十进制表示。 - 子网掩码用于定义网络部分和主机部分,如255.255.255.0。 - IP地址的分类:A类、B类、C类、D类(多播)和E类(保留)。 #### 1.2 子网划分 - 子网划分用于优化IP地址的分配,通过借用主机位创建更多的子网。 - 子网计算涉及掩码位数选择,以及如何确定可用的主机数和子网数。 - CIDR(无类别域间路由)表示法用于更有效地管理IP地址空间。 #### 1.3 私有IP地址 - 为了节省公网IP地址,私有IP地址被用于内部网络,如10.0.0.0/8,172.16.0.0/12,192.168.0.0/16。 #### 1.4 广播地址 - 每个网络都有一个特定的广播地址,所有数据包都会发送到这个地址以达到同一网络内的所有设备。
项目实现了对特产信息管理、特产分类管理、特产分类管理、特产评分管理、系统管理、订单管理等业务进行管理。 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea
随着21世纪网络和计算机技术的飞速发展,它们已经与我们的日常生活紧密融合。当前网络的运行速度已经达到千兆级别,覆盖范围广泛,深入到生活的每一个角落。这一进步推动了管理系统的发展,使得远程处理事务、远程工作信息管理和实时追踪工作状态成为可能。网上管理系统以其前所未有的体验满足了新时代的工作需求,因此得到了大力发展。 本系统是一个个人日常事务管理系统,利用计算机和网络技术开发的在线平台,能够实现日常安排、消费记录和重要提醒设置等功能。系统采用SSM框架和Vue技术,数据库使用MySQL,开发环境为Eclipse。系统用户角色包括普通用户和管理员,功能涵盖个人中心管理、用户管理、日常安排管理、消费记录管理和重要提醒管理。用户可以记录消费、安排日常事务和设置重要提醒,而管理员则负责管理用户信息和基础数据信息。该系统不仅方便了用户和管理员,还提高了个人事务管理的效率,更适应现代人的生活方式。
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea、微信开发者工具 数据库:MySql5.7以上 部署环境:maven 数据库工具:navicat
如何使用Python和PIL库生成带竖排文字的封面图像