dom4j_API_示例讲解.pdf

4星(超过85%的资源)
所需积分/C币:9 2011-09-29 10:58:35 1.71MB PDF
2
收藏 收藏
举报

dom4j_API_示例讲解.pdf dom4j_API_示例讲解.pdf dom4j_API_示例讲解.pdf dom4j_API_示例讲解.pdf dom4j_API_示例讲解.pdf dom4j_API_示例讲解.pdf dom4j_API_示例讲解.pdf dom4j_API_示例讲解.pdf dom4j_API_示例讲解.pdf dom4j_API_示例讲解.pdf dom4j_API_示例讲解.pdf dom4j_API_示例讲解.pdf
根据本人自己的经验,读取的字符编码是按照XML文件头定义的编码来转换。如果遇到 乱码问题,注意要把各处的编码名称保持一致即可。 2取得Root节点 读取后的第二步,就是得到Root节点。熟悉ML的人都知道,一切ML分析都是从Ro ot元素开始的。 public Element getRootDlement( document doc)I return doc. getRootElement( 3.遍历ML树 DOM4J提供至少3和遍历节点的方法 1)枚举! Iterator) /枚举所有子节点 for Iterator i= root. elementIteratoro: i hasNext(:)[ Element element=(Element)i next O //d thing //枚举名称为foc的节点 Iterator or(foo): i. hasNcxt(: Elenent foo =(Element)i, next /, do something /枚举属忾 for Iterator i root, attributcltcrator(; i hasNcxt:)[ Attribute attribute = (Attribute)i next O // do some 递归 递归也可以采用 Iterator作为枚举手段,但文档中提供了另外的做法 public void treeWalko( treeWalk(getRootElement () public void treeWalk (Element element for (int i=0, size= element. nodeCount(:i< size: i++i Node node element node (i) (node instanceof Element)! treeWalk((Element)node? i else[// do something 3 Visitor模式 最令人以奋的是0MA4J对 Visitor的支持,这样可以大大缩减代码量,并且清楚易懂。 了解设计模式的人都知道, Visitor是GOF设计棋式之。其主要原理就是两种类互相保有 对方的引用,并且种作为Ⅴ isi tor去访问许多 imitable。我们来看DM4』中的Ⅴ asi tor 模式(快央速文档中没有提供) 只需要自定一个类实现Ⅴ ls1 tor接口即可。 public class MyVisitor extends visitorSupport public void visit(Element element)[ System. out. println(element. get) public void visit (Attribute attr)( Systell. ouL prinTln(altr. ge LName() 调用:root. accept( new My visitor() Visitor接口提供多种 Visit(的重载,根据XML不同的对象,将采用不同的方式来访 问。上面是给出的 Element和 Attribute的简单实现,一般比铰常用的就是这两个。 Visit orsuppor't是DoM!J提供的默认适配器, visitor接口的 Default Adaptor模式,这个模式 给出了各和 visit(*)的空实现,以便简化代码。 注意,这个 Visitor是自动遍历所有子节点的。如果是root. accept( My Visitor),将 遍历了节点。我第一次用的时候,认为是需要自己遍历,便在递归中调用 Visitor,结果可 想而知 1. XPath支持 DOM4J对 XPath有良好的支持,如访问一个节点,可直接用 XPath选择 public void bar(Document document) List list= documcnt. sclcctNodcs(//foo/bar Node node document select SingleNode(//foo bar/author String name= node valueof( @name 例如,如果你想查找ⅫHTML文档中所有的超接,下面的代码可以实现: public void find inks(Document document) throws DocumentException i List list document selectNodes(//a/href for (Iterat list iterator (: iter. hasNextO:)i Attribute attribute=(Attribute) itor nexto String url attribute getvalue() 5.宁符串与ⅫML的转换 有时候经常要用刭字符串转换为XML或反之, /XⅦL转字符串 DoC ument documenT String text= document. asXML O /宇符串转X String text =<name>James</name></person> Doci ment. document.=Document. Helper perse Text(text 6用XSLT转换XM public document sty leDocument i Document document String stylesheet throws Exception // load the trans former using JAXP Trans formerFactory factory- TransformerFactory newInstance( Transformer transformer= factory. newTransformer( new StreamSource( stylesheet ); /A row lets style the given document Document Source source= new Document Source( document Document Result result new Document result trans former, transform( source, result // return the transformed document Document transformedDoc= result. getDocument O rcturn transformeddoc 7.创建XM 一般创建ⅪML是写文件前的工作,这就像 StringBuffer一样容易 public Document createDocument(( Document document=Document Helper. createDccument( Element root= document. addElement (root) Elenent authorl root addElement (author) addAttribute(name, James) nddAttributc(location, UK) addText(James Strachan; Element author root addElement (author) addAttributc (namc. Bob, addAttribute(location, US) addText(Bob McWhirter) return document 8.文件输出 个简单的输出方法是将一个 Document或任何的Node通过wite方法输出 FileWriter out= new FileWriter( foU xl1 document. write(out) 如果你想改变输岀的格式,比如美化输岀或缩减格式,可以用 XMLWriter类 public void write (document document) throws IOExcepticn I //指定文亻 XMLWriter writer= new XML Writer( new FileWriter( output xml writer. write document writer. close 美化格式 OutputFormat format= OutputFormat. createPret ty Print( writer= new XML. Writer( System. out, format writer. write( document 3 /缩诚格式 Tornal =OuLpulFurmal creaTe Compac LFurlaLO) writer= new XML Writer( System. out, format writer. write( document 如何,DM4J够简单吧,当然,还有一些复杂的应用没有提到,如 Elementhandler等 如果你动心了,那就一起来用DOM4J 使用介绍2 文上要讨论了用dom4j解析XM的基础问题,包括建立MM文档,添加、修改、删除 节点,以及格式化(美化)输出和屮文问趣。可作为dom4j的入门资料。 1.下载与安装 dom4j是 sourccforgc.net上的一个开源项,主要用于对XML的解析。从2001年7 月发布第一版以米,已陆续推出多个版本,目前最高版本为1.5。 dom4专门针对Iava开发,使用起来非常简单、直观,在Java界,dcm4j正迅速晋及。 可以到http://sourceforge.net/prejects/dom4j下载其最新版。 dun4j1.5的完整版大约13M,是一个名为doun4j-1.5.zip的压缩包,解压后有一个dom 4j-1.5.iar文件,这就是应用时需要引入的类包,另外还有一个 Waxen-1.1-beta-4.jar文 件,一般也需要引入,否则执行时可能抛java.1ang. Noc lass Deffaunderror:org/ . axer/J axerExceplio异常,其他的包可以选择用之。 2.示例ⅪML文档( holen.xml) 为了述说方便,先看一个ⅫML文档,之后的操作均以此文档为基础。 holen. xml ? xn version="1.0″ encoding="UTF-8″ <book <I--This is a test for dom4 j, holen, 2004.9.I1--> Book show= ves> 4j Tutorials/ title> </book> <book show= ves> Title>Lucene Studing/title> C/book <book show- no> < Lucene in Action</title> (/book> Kowner >o Reilly/owner> 这是一个很简单的ML文档,场景是一个网上书店,有很多书,每木书有两个属性,一 个是书名,一个为是否展示[show],最后还有一项是这些书的拥有者[oner]信息 3.建立一个XM文档 *建立一个XM文档,文档名由输入属性决定 米@ aram filename需建立的文件名 @retu返回操作结果,0表失败,1表成功 public int createXMLFile(String filename)[ 返回操作结果,0表失败,1表成功* int returnvalue =o /种米建立 document对象* Document document=DocumentHelper createDocument O /*建立XM文档的根hoks* Elenent booksElement doc unent addElement("booss") /*加入一行注释* booksElement. addComment( This is a test for dom4j, holen, 2004.9. 11) /**加入第一个bcok节点* Element bookFlement booksElement addFlement baok") /种加入sow属内容* bookElement. addAttribute( show","yes") /**加入 title节点* Elenent titleelement bookElement addElement i title 为 title设置内容* titleElement. setText(Dom4j Tutorials", /*类似的完成后两个book*/ bookElement booksElement addElement(book ") bookElement. addAttribute( show", yes") titleElement= bookElement addElement( title" titleElement. setText (Lucene Studing") bookElement-boaksElement addElement("book bookElement. addAttribute( show", no) titleElement= baokElement addElement(title titleLlement, setText(Lucene in Action) /米*加入ner节点* Element ownerElement booksElement EddElement(owner") ownerElement set Text(O Reilly") try i /*将 document中的内容写入文件中米/ XMLWriter writer= new XMLWriter(new FileWriter(new File(filename))) writer. write(dncument .iter. close o /米米执行成功,需返回1米/ returnvalue= 1 J catch(Exception ex) ex. printstackTraceo rcturn rcturnvaluc 说明 Documentdocument- DocumentHclper crcatcDccument O 通过这句定义一个ML文档对象。 Elenent booksElenent document, addElement(booss 通过这句定义一个ML元素,这里添加的是节点。 Element有几个重要的方法: 1 addComment:添加注程 1 addAttribute:添加属性 1 addElement:添加」元素 最后通过 XMLWritcr生成物理文件,默认生成的MML文件排版格式比较乱,可以通过0 utputFormat类的 createCompact Format(方法或 createPrettyPrint()方法格式化输出, 默认采用 create CompactFormat O方法,显示比较紧凑,这点将在后面详纽谈到。 生成后的 holen.xm1文件内容如下: <?xml version="1.0 encoding UTF-8"?> <books><!--This is a test for domi, holen, 2001. 9. 11-->bock shcw"yos">t itle>Dom4j Tutorials</title></book>(book show= yes ><title)Lucene Studing(/tit e>/book><book show=no x<title>Lucene in Action/title></book>owner >0 Reilly< / er></hooks> 4.修改ⅪML文档 有三项修改任务,依次为 1如果boo节点中show属性的内容为yes,则修改成nc 1把 owner项内容改为 Tshinghua,并添加date节点 1若 title内容为Dom4 j Tutorials:则删狳该节点 *修改ⅫML文件屮内容,并另存为一个新文件 *重点掌握dom4中如何添加节点,修改节点,除节点 @ param filename修改对象文件 @ param newfilename修改后另存为该文件 * Return返回操作结果,0表失败。1表成功 public int Modi XMLFile(String filename, String newfilename)[ int returnValue =0: SAXReader sax Reader new SAXReaderO DocumeNt document= saxReader read ( new File(filename) /米修改内容之一:如果book节点中shox属性的内容为yes,则修改成n米/ /米*先用 xpath查找对象米 List list- document selectNodes("/books/ book/@show") Iterator iter= list iterator( while(iter has Nexto) Attribute attribute(Attribute)it i=(attribute getValue( equals("yes)) attribute setValue("no *修改内容之二:把ower项内容改为 Tshinghua *并在 owner节点中加入date节点,date节点的内容为2004-0911,还为date节点添 加一个属性typc list document selectNodes("/'books/owner") list. iterator ( i=(iter hasNext()[ Element ownerElenent=(Element)iter. next) ownerElement set Text(Tshinghua") Elenent dateElement ownerElement addElement( date") datcElcmcnt. sctText( 2001-09-11 dateElement. addAttribute( type", Gregorian calendar) /种修改内谷之一:若tie内容为nom4 j Tutorials,则删除该节点 st document selectNodes"/books /book) iter= list iterator ( while(iter. hasNexto)i Elenent bookElemenl=(Element)iLer. nexL( Iterator iterator bookElement elementIterator("title" while(iterator. hasNexto)( Elenent titleElement=(Element)iterator. next) i=(tit.. get Text (. equals("Dom4j Tutorials )) bookElenment. r'emove(titleElenent) /将 document中的内容写入文件中*/ XMLWriter writer= new XML Writer(new FileWriter(new File(newfilename)) writer. write(document) writer. close /*执行成功,需返回1* reluruValut=l J catch(Exception ex)t ex. printStackTraceo) I catch(Exception ex)( ex. printstackTraceO return returnvalue 说明: List list document, selectNodes("/books/book/'show") list document select Nodes("/books/book") 上述代码通过 xpath查找到相应内容 通过 setvalue0、 setTexto修改节点内容。 通过 rcmovc(删除节点或属性。 5.格式化输出和指定编码 默认的输出方式为紧凑方式,默认编码为UTF-8,但对于我们的应用而言,一般都要用 到中文,并且希望显示时按自动缩进的方式的显示,这就需用到 OutputFormat类 *格式化ⅪM.文档.并解决中文问题 米@ param filename * return public int formatXMLFile (string filename)( int returnvalue =0: SAXReader saxReader= new SAXReadero) Document document saxReader read (new File(filename)) XMLWriter writer= null /*格式化输出,类型IE浏览一样 OutputFormat format=Output Format. createPrettyPrint( /指定Ⅻ编码* format set Encoding(GBK") writer= new XML Writer(new FileWriter(new File'f'ilename)), format)

...展开详情
试读 11P dom4j_API_示例讲解.pdf
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
Honly_java 只有几个简单的小例子,入门还可以
2014-07-29
回复
huangqiong 还不错,里面有我需要的东西
2012-12-18
回复
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
  • 分享王者

关注 私信
上传资源赚钱or赚积分
最新推荐
dom4j_API_示例讲解.pdf 9积分/C币 立即下载
1/11
dom4j_API_示例讲解.pdf第1页
dom4j_API_示例讲解.pdf第2页
dom4j_API_示例讲解.pdf第3页

试读结束, 可继续读1页

9积分/C币 立即下载