您好,欢迎访问三七文档
Dom4j使用简介作者:冰云icecloud(AT)sina.com时间:2003.12.15版权声明:本文由冰云完成,首发于CSDN,未经许可,不得使用于任何商业用途。文中代码部分引用自DOM4J文档。欢迎转载,但请保持文章及版权声明完整。如需联络请发邮件:icecloud(AT)sina.comDOM4J是dom4j.org出品的一个开源XML解析包,它的网站中这样定义:Dom4jisaneasytouse,opensourcelibraryforworkingwithXML,XPathandXSLTontheJavaplatformusingtheJavaCollectionsFrameworkandwithfullsupportforDOM,SAXandJAXP.Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。DOM4J使用起来非常简单。只要你了解基本的XML-DOM模型,就能使用。然而他自己带的指南只有短短一页(html),不过说的到挺全。国内的中文资料很少。因而俺写这个短小的教程方便大家使用,这篇文章仅谈及基本的用法,如需深入的使用,请……自己摸索或查找别的资料。之前看过IBMdeveloper社区的文章(参见附录),提到一些XML解析包的性能比较,其中DOM4J的性能非常出色,在多项测试中名列前茅。(事实上DOM4J的官方文档中也引用了这个比较)所以这次的项目中我采用了DOM4J作为XML解析工具。在国内比较流行的是使用JDOM作为解析器,两者各擅其长,但DOM4J最大的特色是使用大量的接口,这也是它被认为比JDOM灵活的主要原因。大师不是说过么,“面向接口编程”。目前使用DOM4J的已经越来越多。如果你善于使用JDOM,不妨继续用下去,只看看本篇文章作为了解与比较,如果你正要采用一种解析器,不如就用DOM4J吧。它的主要接口都在org.dom4j这个包里定义:AttributeAttribute定义了XML的属性BranchBranch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为,CDATACDATA定义了XMLCDATA区域CharacterDataCharacterData是一个标识借口,标识基于字符的节点。如CDATA,Comment,Text.CommentComment定义了XML注释的行为Document定义了XML文档DocumentTypeDocumentType定义XMLDOCTYPE声明ElementElement定义XML元素ElementHandlerElementHandler定义了Element对象的处理器ElementPath被ElementHandler使用,用于取得当前正在处理的路径层次信息EntityEntity定义XMLentityNodeNode为所有的dom4j中XML节点定义了多态行为NodeFilterNodeFilter定义了在dom4j节点中产生的一个滤镜或谓词的行为(predicate)ProcessingInstructionProcessingInstruction定义XML处理指令.TextText定义XML文本节点.VisitorVisitor用于实现Visitor模式.XPathXPath在分析一个字符串后会提供一个XPath表达式看名字大致就知道它们的涵义如何了。要想弄懂这套接口,关键的是要明白接口的继承关系:ointerfacejava.lang.Cloneableointerfaceorg.dom4j.Nodeinterfaceorg.dom4j.Attributeinterfaceorg.dom4j.Branchinterfaceorg.dom4j.Documentinterfaceorg.dom4j.Elementinterfaceorg.dom4j.CharacterDatainterfaceorg.dom4j.CDATAinterfaceorg.dom4j.Commentinterfaceorg.dom4j.Textinterfaceorg.dom4j.DocumentTypeinterfaceorg.dom4j.Entityinterfaceorg.dom4j.ProcessingInstruction一目了然,很多事情都清楚了。大部分都是由Node继承来的。知道这些关系,将来写程序就不会出现ClassCastException了。下面给出一些例子(部分摘自DOM4J自带的文档),简单说一下如何使用。1.读取并解析XML文档:读写XML文档主要依赖于org.dom4j.io包,其中提供DOMReader和SAXReader两类不同方式,而调用方式是一样的。这就是依靠接口的好处。//从文件读取XML,输入文件名,返回XML文档publicDocumentread(StringfileName)throwsMalformedURLException,DocumentException{SAXReaderreader=newSAXReader();Documentdocument=reader.read(newFile(fileName));returndocument;}其中,reader的read方法是重载的,可以从InputStream,File,Url等多种不同的源来读取。得到的Document对象就带表了整个XML。根据本人自己的经验,读取的字符编码是按照XML文件头定义的编码来转换。如果遇到乱码问题,注意要把各处的编码名称保持一致即可。2.取得Root节点读取后的第二步,就是得到Root节点。熟悉XML的人都知道,一切XML分析都是从Root元素开始的。publicElementgetRootElement(Documentdoc){returndoc.getRootElement();}3.遍历XML树DOM4J提供至少3种遍历节点的方法:1)枚举(Iterator)//枚举所有子节点for(Iteratori=root.elementIterator();i.hasNext();){Elementelement=(Element)i.next();//dosomething}//枚举名称为foo的节点for(Iteratori=root.elementIterator(foo);i.hasNext();){Elementfoo=(Element)i.next();//dosomething}//枚举属性for(Iteratori=root.attributeIterator();i.hasNext();){Attributeattribute=(Attribute)i.next();//dosomething}2)递归递归也可以采用Iterator作为枚举手段,但文档中提供了另外的做法publicvoidtreeWalk(){treeWalk(getRootElement());}publicvoidtreeWalk(Elementelement){for(inti=0,size=element.nodeCount();isize;i++){Nodenode=element.node(i);if(nodeinstanceofElement){treeWalk((Element)node);}else{//dosomething....}}}3)Visitor模式最令人兴奋的是DOM4J对Visitor的支持,这样可以大大缩减代码量,并且清楚易懂。了解设计模式的人都知道,Visitor是GOF设计模式之一。其主要原理就是两种类互相保有对方的引用,并且一种作为Visitor去访问许多Visitable。我们来看DOM4J中的Visitor模式(快速文档中没有提供)只需要自定一个类实现Visitor接口即可。publicclassMyVisitorextendsVisitorSupport{publicvoidvisit(Elementelement){System.out.println(element.getName());}publicvoidvisit(Attributeattr){System.out.println(attr.getName());}}调用:root.accept(newMyVisitor())Visitor接口提供多种Visit()的重载,根据XML不同的对象,将采用不同的方式来访问。上面是给出的Element和Attribute的简单实现,一般比较常用的就是这两个。VisitorSupport是DOM4J提供的默认适配器,Visitor接口的DefaultAdapter模式,这个模式给出了各种visit(*)的空实现,以便简化代码。注意,这个Visitor是自动遍历所有子节点的。如果是root.accept(MyVisitor),将遍历子节点。我第一次用的时候,认为是需要自己遍历,便在递归中调用Visitor,结果可想而知。4.XPath支持DOM4J对XPath有良好的支持,如访问一个节点,可直接用XPath选择。publicvoidbar(Documentdocument){Listlist=document.selectNodes(//foo/bar);Nodenode=document.selectSingleNode(//foo/bar/author);Stringname=node.valueOf(@name);}例如,如果你想查找XHTML文档中所有的超链接,下面的代码可以实现:publicvoidfindLinks(Documentdocument)throwsDocumentException{Listlist=document.selectNodes(//a/@href);for(Iteratoriter=list.iterator();iter.hasNext();){Attributeattribute=(Attribute)iter.next();Stringurl=attribute.getValue();}}5.字符串与XML的转换有时候经常要用到字符串转换为XML或反之,//XML转字符串Documentdocument=...;Stringtext=document.asXML();//字符串转XMLStringtext=personnameJames/name/person;Documentdocument=DocumentHelper.parseText(text);6用XSLT转换XMLpublicDocumentstyleDocument(Documentdocument,Stringstylesheet)throwsException{//loadthetransformerusingJAXPTransformerFactoryfactory=TransformerFactory.newInstance();Transformertransformer=factory.newTransformer(newStreamSource(stylesheet));//nowletsstylethegivendocumentDocumentSourcesource=newDocumentSource(document);DocumentResultresult=newDocumentResult();transformer.transform(source,result);//returnthetransformeddocumentDocumenttransformedDoc=result.getDocument();returntransformedDo
本文标题:Dom4j使用简介
链接地址:https://www.777doc.com/doc-2910201 .html