admin 管理员组文章数量: 1184232
2024年4月20日发(作者:软件测试常见笔试题)
科技信息 计算机与网络
基孑DOM4J帕XML文档翩析技术
南京政治学院 肖袁
[摘要]本文介绍了DoM4l产生的背景和DOM4J ̄ ,并讨论了利用XMLD0M4J技术来实现动态地创建文档,以及遍历文档
结构、添加、修改、文档内容等方法。
[关键词]DoM4『API XML DOM SAX
随着XML的日益流行,各种数据的存储、传输更多的是以XML文
档的形式进行的。如何对这些XML文档进行解析、定位、操作和查询来
满足用户的各种需求,以及将取得的资料做更进一步的应用是XML应
用开发者面临的关键问题。目前已经面世的xML【 解析器有:DOM、
SAX、JDOM以及DOM4J。
1、DOM、SAX、dDOM简介
DOM[- 是用与平台和语言无关的方式表示XML文档的官方W3C
标准。DOM是以层次结构组织的节点或信息片段的结合。这个层次结
构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个
文档和构造层次结构,然后才能做任何工作。由于使用DOM解析器的
时候需要处理整个XML文档,所以对性能和内存要求比较高,尤其遇
到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于
XML文档需要频繁的改变的服务中。
SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而
不是等待所有的数据被处理。而且由于应用程序只是在读取数据时检
查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨
大的优点。
JDOM的目的是成为Java特定文档模型,它简化与XML的交互并
且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得
到大力推广和促进。JDOM与DOM主要有两方面不同。首先,JDOM仅
使用具体类而不使用接口。第二,API大量使用了Co]leetings类,简化了
那些已经熟悉这些类的Java开发者的使用。
2、DOM4J罔
DOM4合并了许多超出基本XML文档表示的功能,包括集成的
Xpath支持、XML Schema支持以及用于大文档或流化文档的基于事件
的处理。它还提供了构建文档表示的选项,它通过DOM4J API和标准
DOM接口具有并行访问功能。DOM4J使用接口和抽象基本类方法。
DOM4J大量使用了API中的Collecting类,但在许多情况下,它还提供
一
些替代方法以允许更好的性能或更直接的编码方法,因此提供了比
JDOM大得多的灵活性。在添加灵活性、XPath集成和对大文档处理的
目标时,D0M4J的目标和JDOM是一样的:针对Java开发者的易用性
和直观操作。它还致力于成为比JDOM更完整的解决方案,实现在本质
上处理所有Java/XML问题的目标。在完成该目标时,它比JDOM更少
强调防止不正确的应用程序行为。
3、Dom4d简介
3.1 DOM4J的主要接口
Dom4J的主要接口都在org.DOM4J的包里定义,主要有如下几种:
Attribute:定义XML的属性
Branch:为能够包含子节点的节点如XML元素(Element)和文档
fDocuemnts)定义了一个公共行为
CDATA:定义了XML CDATA区域
CharacterData:是一个标识接口,标识基于字符的节点。如CDATA,
Comment,Text.
Comment:定义了XML注释的行为
Document:定义了XML文档
DocumentType:定义XML DOCTYPE声明
Element:定义XML元素
ElementHandler:定义了Element对象的处理器
ElementPath:被ElementHandler使用,用于取得当前正在处理的路
径层次信息
Entity:定义XML entity
Node:为所有的DOM4J中XML节点定义了多态行为
NodeFiher:定义了在DOM4J节点中产生的一个滤镜或谓词的行为
(predicate)
ProcessingInstruction:Processinglnstruetion定义XML处理指令
Text:定义XML文本节点
Visitor:用于实现Visitor模式
XPath:在分析一个字符串后会提供一个XPath表达式
3.2接口之间的继承关系如下:
interface java.1ang.Cloneable
interface org.dom4j.Node
interface org.dom4j.Attirbute
interface org.dom4j.Branch
interface org.dom4j.Document
interface org.dom4j.Element
interface org.dom45.CharacterData
interfaee org.dom4j.CDATA
interface org.dom4j.Comment
interface org.dom4j.Text
interface org.dom4j.DocumentType
interface org.dom4j.Entity
interface org.dom4j.ProcessingInstruction
4、DOM4J的具体使用
4.1读取并解析XML文档
读写XML文档主要依赖org.domdj.io包,其中提供DOMReader和
SAXReader两种不同的方法,采用同样的调用方式。
,/从文件读取XML,输入文件名,返回XML文档
public Doeument read(Stitng ifleName)throws MalformedURLException,
DocumentException{
SAXRcader reader=new SAXReader0;
Document document=reader.read(new File(ifleName));
retum doeument:
)
其中,reader.read0是重载的,可以读取InputStream、File、Url等多种
不同的资源,得到的Document对象就代表了整个XML。
4.2取得Root节点
读取XML文档后的第二步就是得到Root节点,一切XML分析都
是从Root元素开始。
public Element getRootElement(Document doc){
return doe.getRootElement0;
j
43遍历XML树
dom4j提供至少3种遍历节点的方法:
方法一:枚举(herator)
,/枚举所有子节点
for(herator.=root.elementherator0;i.hasNext0;){
Element element=(Element)i.next0;
||do something
)
,/枚举名称为foo的节点
f0r(herator i=root.elementherator(foo);i.hasNext0;)(
Element foo:(Element)i.next0;
||do something
)
//枚举属性
fnr(herator i=root.attributelterator0;i.hasNexrt0;)l
Attribute attirbute=(Attribute)i.next0;
|I do something
.--——
229..-——
科技信息
J
计算机与网络
一
般创建XML是写文件前的工作,这就像StringBuffer一样容易。
方法二:递归
public void treeWalk0 f
treeWalk(getRootElement0);
}
public void treeWalk(Element element){
public Document createDocument0{
Document document=DocumentHelper.cmateDocument0;
Element rot=document.addElement(root);
Element authorl:
root
.
for(int i:0,size=element.nodeCount0;i<size;j++) {
Node node=element.node(i);
if(node instanceof Element){
treeWalk((Element)node);
1 else{,,do something…
J
}
】
.
addElement(author)
addAttribute(name,James)
addAttribute(1ocation,UK)
addText(James Strachan);
.
.
Element author2=
root
.
addElement(author)
addAttirbute(name,Bob1
addAttribute(1ocation,US)
addText(Bob McWhirter);
.
方法三:Visitor模式
dom4j) ̄{Visitor的支持可以大大缩减代码量,并且清楚易懂。Visitor
是GOF设计模式之一。其主要原理就是两种类互相保有对方的引用。
dom4j中的Visitor模式只需要自定一个类实现Visitor接口即可。
public class MyVisitor extends VisitorSupport{
public void visit(Element element){
一
.
.
return document;
l
4.8文件输出
个简单的输出方法是将一个Document或任何的Node通过write
方法输出。
FileWriter out=new FileWriter(foo.xml 1:
document.write(out);
如果你想改变输出的格式,比如美化输出或缩减格式,可以用
System.out.println(element.getName0);
)
public void visit(Attribute attr)(
System.out.println(attr.getName0);
}
)
调用:root.accept(new MyVisitor0)
XMLWriter类
public void write(Document document)throws IOException{
,/指定文件
xMLWriter writer=new XMLWriter(
new FileWriter(output.xm1)
);
Visitor接1:3提供多种Visit0的重载,根据XML不同的对象,将采用
不同的方式来访问。
4.4 XPath支持
dom4j对XPath有良好的支持。
public void bar(Document document)(
List list=document.selectNodes(Ilfoo/bar);
writer.write(document);
writer.close@
,/美化格式
OutputFolTnat format=OutputFonnat.ereatePrettyPrint0;
writer=nev ̄XMLWriter(System.out,format);
writer.write(document);
Node node=document.selectSingleNode(//foo/bar/author);
String nal/le=node.valueOf(@name);
)
4.5字符串与XML的转换 ,/缩减格式
format=OutputFormat.createCompactFormat0;
writer=new XMLWriter(System.out,format);
writer.writef document):
有时候经常要用到字符串与XML文档之间的相互转换,方法如
下:
//XML转字符串
1)ocument document;
String text=document.asXML0;
,/字符串转XML
Sting rtext=<person><name>Jaines</name></person>;
}
5、几种解析器的比较
Document document=DocmnentHelper.parseText(text);
4.6用XSLT转换XML
public Document styleDocument(
Document document.
Sting rstyl ̄heet
)throws Exception{
//load the transformer using JAXP
TransformerFactory factory TransformerFactory.newlnstance0;
Transformer transformer=factory.newTransformerf
(1)Dom4J性能最好,目前许多开源项目中大量采用DOM4J,如果
不考虑可移植性,那就采用DOM4J。
(2)JDOM和DOM在性能测试时表现不佳,在测试IOM文档时内
存溢出。在小文档情况下还值得考虑使用DOM和JDOM。DOM仍是一
个非常好的选择,DOM实现广泛应用于多种编程语言。它还是许多其
它与XML相关的标准的基础,因为它正式获得W3C推荐,所以在某些
类型的项目中可能也需要它。
(3)SAX表现较好,这要依赖于它特定的解析方式——事件驱动。
个SAX检测即将到来的XML流,但并没有载人到内存。
通过DOM4J提供的接口,有助于我们在编写XML应用程序时可
以很容易地取得XML文件资料,并方便的对它进行操作。
一
new StreamSource(stylesheet)
);
//now lets style the given document
参考文献
l 1 jhttp://vcww w3.org/DOM/[EB/OL J.
DocumentSource source:new DocumentSource(document);
[2]左伟明即用即查——Ⅺ L数据标记语言参考手 ̄IPr[M].北京:
人民邮电出版社.2007
DocumentResuh result new DocumentResuh0;
transformer.transform(source,result);
//return the transfonned document
[3]孙一中等.XML理论和应用基础[M].北京:北京邮电大学出版
社.2000.
Document transformedDoc=result.getDocument0;
retum transformedDoc;
[4]陈锦辉,江钧精通从HTML到XML实务经典[M]北京:中国
青年出版社,2000
l 5 jhttp://dom4j.sourceforge.net
}
4.7创建XML
版权声明:本文标题:基于DOM4J的XML文档解析技术 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1713564495a640977.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论