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 


本文标签: 文档 节点 接口 使用 数据