




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
dom4jAPI使用簡介功能簡介dom4j是一個Java的XMLAPI,類似于jdom,用來讀寫XML文件的。dom4j是一個非常非常優(yōu)秀的JavaXMLAPI,具有性能優(yōu)異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件,可以在 SourceForge上找到它。在 IBMdeveloperWorks 上面可以找到一篇文章,對主流的 JavaXMLAPI進行的性能、功能和易用性的評測, dom4j無論在那個方面都是非常出色的。 如今你可以看到越來越多的 Java軟件都在使用 dom4j來讀寫XML,特別值得一提的是連 Sun的JAXM也在用dom4j。這是必須使用的 jar 包,Hibernate用它來讀寫配置文件。概念DOM4J是 出品的一個開源 XML解析包,它的網站中這樣定義:Dom4jisaneasytouse,opensourcelibraryforworkingwithXML,XPathandXSLTontheJavaplatformusingtheJavaCollectionsFrameworkandwithfullsupportforDOM,SAXandJAXP.Dom4j是一個易用的、開源的庫,用于 XML,XPath和XSLT。它應用于Java平臺,采用了Java集合框架并完全支持DOM,SAX和JAXP。DOM4J使用起來非常簡單。只要你了解基本的XML-DOM模型,就能使用。然而他自己帶的指南只有短短一頁(html),不過說的到挺全。國內的中文資料很少。因而俺寫這個短小的教程方便大家使用,這篇文章僅談及基本的用法,如需深入的使用,請??自己摸索或查找別的資料。之前看過IBMdeveloper 社區(qū)的文章(參見附錄),提到一些 XML解析包的性能比較,其中DOM4J的性能非常出色, 在多項測試中名列前茅。 (事實上 DOM4J的官方文檔中也引用了這個比較)所以這次的項目中我采用了 DOM4J作為XML解析工具。在國內比較流行的是使用 JDOM作為解析器,兩者各擅其長,但 DOM4J最大的特色是使用大量的接口,這也是它被認為比 JDOM靈活的主要原因。大師不是說過么,“面向接口編程”。目前使用 DOM4J的已經越來越多。如果你善于使用 JDOM,不妨繼續(xù)用下去,只看看本篇文章作為了解與比較,如果你正要采用一種解析器,不如就用 DOM4J吧。它的主要接口都在 org.dom4j 這個包里定義:AttributeAttribute 定義了XML的屬性BranchBranch
為能夠包含子節(jié)點的節(jié)點如
XML元素(Element)
和文檔
(Docuemnts)
定義了一個公共的行為,CDATACDATA定義了XMLCDATA區(qū)域CharacterDataCharacterData 是一個標識接口,標識基于字符的節(jié)點。如 CDATA,Comment,Text.CommentComment定義了XML注釋的行為Document定義了XML文檔DocumentTypeDocumentType 定義XMLDOCTYPE聲明ElementElement 定義XML元素ElementHandlerElementHandler 定義了Element 對象的處理器ElementPath 被ElementHandler 使用,用于取得當前正在處理的路徑層次信息EntityEntity 定義XMLentityNodeNode為所有的 dom4j中XML節(jié)點定義了多態(tài)行為NodeFilterNodeFilter 定義了在 dom4j節(jié)點中產生的一個濾鏡或謂詞的行為(
predicate
)ProcessingInstructionProcessingInstruction
定義
XML
處理指令
.TextText
定義
XML文本節(jié)點
.VisitorVisitorXPathXPath
用于實現 Visitor 模式.在分析一個字符串后會提供一個
XPath
表達式看名字大致就知道它們的涵義如何了。要想弄懂這套接口,關鍵的是要明白接口的繼承關系:一目了然,很多事情都清楚了。大部分都是由Node繼承來的。知道這些關系,將來寫程序就不會出現ClassCastException了。使用簡介下面給出一些例子(部分摘自 DOM4J自帶的文檔),簡單說一下如何使用。1.讀取并解析 XML文檔:讀寫XML文檔主要依賴于包,其中提供DOMReader和SAXReader兩類不同方式,而調用方式是一樣的。這就是依靠接口的好處。從文件讀取XML,輸入文件名,返回XML文檔publicDocumentread(StringfileName)throwsMalformedURLException,DocumentException{SAXReaderreader=newSAXReader();Documentdocument=reader.read(newFile(fileName));returndocument;}其中,reader源來讀取。得到的
的read方法是重載的,可以從Document對象就帶表了整個
InputStream,File,UrlXML。
等多種不同的根據本人自己的經驗, 讀取的字符編碼是按照亂碼問題,注意要把各處的編碼名稱保持一致即可。2.取得Root節(jié)點讀取后的第二步,就是得到 Root節(jié)點。熟悉ot元素開始的。
XML文件頭定義的編碼來轉換。 如果遇到XML的人都知道,一切 XML分析都是從 RopublicElementgetRootElement(Documentdoc){returndoc.getRootElement();}3.遍歷XML樹DOM4J提供至少 3種遍歷節(jié)點的方法:1) 枚舉(Iterator)枚舉所有子節(jié)點for(Iteratori=root.elementIterator();i.hasNext();){Elementelement=(Element)i.next();dosomething}枚舉名稱為foo的節(jié)點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();i<size;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){}publicvoidvisit(Attributeattr){}}調用:root.accept(newMyVisitor())Visitor 接口提供多種 Visit() 的重載,根據 XML不同的對象,將采用不同的方式來訪問。上面是給出的 Element和Attribute 的簡單實現,一般比較常用的就是這兩個。 VisitorSupport 是DOM4J提供的默認適配器, Visitor 接口的DefaultAdapter 模式,這個模式給出了各種 visit(*) 的空實現,以便簡化代碼。注意,這個 Visitor 是自動遍歷所有子節(jié)點的。如果是 root.accept(MyVisitor) ,將遍歷子節(jié)點。我第一次用的時候,認為是需要自己遍歷,便在遞歸中調用 Visitor ,結果可想而知。4.XPath
支持DOM4J對XPath有良好的支持,如訪問一個節(jié)點,可直接用
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();}}字符串與XML的轉換有時候經常要用到字符串轉換為XML或反之,XML轉字符串Documentdocument=...;Stringtext=document.asXML();字符串轉XMLStringtext=<name>James</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();returntransformedDoc;}7. 創(chuàng)建XML一般創(chuàng)建XML是寫文件前的工作,這就像 StringBuffer 一樣容易。publicDocumentcreateDocument(){Documentdocument=DocumentHelper.createDocument();Elementroot=document.addElement(root);Elementauthor1=root.addElement(author).addAttribute(name,James).addAttribute(location,UK).addText(JamesStrachan);Elementauthor2=root.addElement(author).addAttribute(name,Bob).addAttribute(location,US).addText(BobMcWhirter);returndocument;}文件輸出一個簡單的輸出方法是將一個 Document或任何的 Node通過write 方法輸出FileWriterout=newFileWriter(foo.xml);document.write(out);如果你想改變輸出的格式,比如美化輸出或縮減格式,可以用 XMLWriter類publicvoidwrite(Documentdocument)throwsIOException{指定文件XMLWriterwriter=newXMLWriter(newFileWriter(output.xml));writer.write(document);writer.close();// 美化格式OutputFormatformat=OutputFormat.createPrettyPrint();writer=newXMLWriter(System.out,format);writer.write(document);// 縮減格式format=OutputFormat.createCompactFormat();writer=newXMLWriter(System.out,format);writer.write(document);}如何,DOM4J夠簡單吧,當然,還有一些復雜的應用沒有提到,如如果你動心了,那就一起來用 DOM4J.
ElementHandler
等。使用介紹 2本文主要討論了用 dom4j解析XML的基礎問題,包括建立XML文檔,添加、修改、刪除節(jié)點,以及格式化(美化)輸出和中文問題??勺鳛?dom4j的入門資料。1.下載與安裝dom4j
是
上的一個開源項目,主要用于對
XML的解析。從
2001年
7月發(fā)布第一版以來,已陸續(xù)推出多個版本,目前最高版本為 1.5。dom4j專門針對 Java開發(fā),使用起來非常簡單、直觀,在 Java界,dom4j正迅速普及??梢缘?projects/dom4j 下載其最新版。dom4j1.5的完整版大約 13M,是一個名為 的壓縮包,解壓后有一個 dom
文件,這就是應用時需要引入的類包,另外還有一個
jaxen-1.1-beta-4.jar
文件,一般也需要引入,否則執(zhí)行時可能拋異常,其他的包可以選擇用之。2.示例XML文檔(holen.xml )為了述說方便,先看一個 XML文檔,之后的操作均以此文檔為基礎。holen.xml<?xmlversion="1.0"encoding="UTF-8"?><books><bookshow="yes"><title>Dom4jTutorials</title></book><bookshow="yes"><title>LuceneStuding</title></book><bookshow="no"><title>LuceneinAction</title></book><owner>O'Reilly</owner></books>這是一個很簡單的XML文檔,場景是一個網上書店,有很多書,每本書有兩個屬性,一個是書名,一個為是否展示[show],最后還有一項是這些書的擁有者[owner]信息。3.建立一個 XML文檔/**建立一個XML文檔,文檔名由輸入屬性決定*@paramfilename 需建立的文件名@return返回操作結果,0表失敗,1表成功*/publicintcreateXMLFile(Stringfilename){/** 返回操作結果,0 表失敗,1 表成功*/intreturnValue=0;/** 建立document對象*/Documentdocument=DocumentHelper.createDocument();/** 建立XML文檔的根books*/ElementbooksElement=document.addElement("books");/** 加入一行注釋 */加入第一個book節(jié)點*/ElementbookElement=booksElement.addElement("book");/** 加入show屬性內容 */bookElement.addAttribute("show","yes");/** 加入title 節(jié)點*/ElementtitleElement=bookElement.addElement("title");/** 為title 設置內容*/titleElement.setText("Dom4jTutorials");/** 類似的完成后兩個 book*/bookElement=booksElement.addElement("book");bookElement.addAttribute("show","yes");titleElement=bookElement.addElement("title");titleElement.setText("LuceneStuding");bookElement=booksElement.addElement("book");bookElement.addAttribute("show","no");titleElement=bookElement.addElement("title");titleElement.setText("LuceneinAction");/** 加入owner節(jié)點*/ElementownerElement=booksElement.addElement("owner");ownerElement.setText("O'Reilly");try{/** 將document中的內容寫入文件中 */XMLWriterwriter=newXMLWriter(newFileWriter(newFile(filename)));writer.write(document);writer.close();/** 執(zhí)行成功,需返回1*/returnValue=1;}catch(Exceptionex){ex.printStackTrace();}returnreturnValue;}說明:Documentdocument=DocumentHelper.createDocument();通過這句定義一個 XML文檔對象。ElementbooksElement=document.addElement("books");通過這句定義一個 XML元素,這里添加的是根節(jié)點。Element有幾個重要的方法:laddComment:添加注釋laddAttribute :添加屬性laddElement :添加子元素最后通過XMLWriter生成物理文件,默認生成的utputFormat 類的createCompactFormat() 方法或
XML文件排版格式比較亂,可以通過createPrettyPrint() 方法格式化輸出,
O默認采用 createCompactFormat() 方法,顯示比較緊湊,這點將在后面詳細談到。生成后的holen.xml 文件內容如下:<?xmlversion="1.0"encoding="UTF-8"?>4.修改
XML文檔有三項修改任務,依次為:l 如果book節(jié)點中show屬性的內容為 yes,則修改成l 把owner項內容改為 Tshinghua,并添加date節(jié)點l 若title 內容為Dom4jTutorials, 則刪除該節(jié)點
no/**修改XML文件中內容,并另存為一個新文件重點掌握dom4j中如何添加節(jié)點,修改節(jié)點,刪除節(jié)點*@paramfilename 修改對象文件*@paramnewfilename 修改后另存為該文件@return返回操作結果,0表失敗,1表成功*/publicintModiXMLFile(Stringfilename,Stringnewfilename){intreturnValue=0;try{SAXReadersaxReader=newSAXReader();Documentdocument=saxReader.read(newFile(filename));/** 修改內容之一: 如果book節(jié)點中show屬性的內容為 yes,則修改成no*//** 先用xpath查找對象 */while(iter.hasNext()){Attributeattribute=(Attribute)iter.next();if(attribute.getValue().equals("yes")){attribute.setValue("no");}}/***修改內容之二: 把owner項內容改為 Tshinghua*并在owner節(jié)點中加入 date節(jié)點,date 節(jié)點的內容為 2004-09-11, 還為date加一個屬性 type*/list=document.selectNodes("/books/owner");iter=list.iterator();if(iter.hasNext()){ElementownerElement=(Element)iter.next();ownerElement.setText("Tshinghua");ElementdateElement=ownerElement.addElement("date");dateElement.setText("2004-09-11");dateElement.addAttribute("type","Gregoriancalendar");}/** 修改內容之三: 若title 內容為Dom4jTutorials, 則刪除該節(jié)點 */
節(jié)點添list=document.selectNodes("/books/book");iter=list.iterator();while(iter.hasNext()){ElementbookElement=(Element)iter.next();Iteratoriterator=bookElement.elementIterator("title");while(iterator.hasNext()){ElementtitleElement=(Element)iterator.next();if(titleElement.getText().equals("Dom4jTutorials")){bookElement.remove(titleElement);}}}try{/** 將document中的內容寫入文件中 */XMLWriterwriter=newXMLWriter(newFileWriter(newFile(newfilename)));writer.write(document);writer.close();/** 執(zhí)行成功,需返回1*/returnValue=1;}catch(Exceptionex){ex.printStackTrace();}}catch(Exc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年醫(yī)學信息技術產品項目資金申請報告代可行性研究報告
- 離岸公司注冊、國際貿易仲裁及爭議解決協議
- 行李意外損壞賠償追加協議
- 2025年中國杯壺產品行業(yè)市場前景預測及投資價值評估分析報告
- 2025年中國薄膜儀器行業(yè)市場前景預測及投資價值評估分析報告
- 跨界合作渠道拓展伙伴權益分配協議
- 航拍影像作品授權使用及衍生品開發(fā)補充協議
- 知識產權交割及后續(xù)產品研發(fā)與市場推廣協議
- 數據安全防護技術支持服務合同(含風險評估)
- 淘寶直播基地直播基地品牌合作與市場營銷策劃協議
- 質量工程師工作簡歷
- 深圳初中英語7、8、9 年級單詞表匯總
- 互聯網金融時代大學生消費行為影響因素研究
- 食品藥品安全監(jiān)管的問題及對策建議
- 信號檢測與估計知到章節(jié)答案智慧樹2023年哈爾濱工程大學
- 國家開放大學一平臺電大《法律社會學》我要考形考任務2及3題庫答案
- 公司收文處理箋
- 6G 移動通信系統
- 環(huán)境因素識別評價表(一)
- 2023年山西建設投資集團有限公司招聘筆試題庫及答案解析
- 鐵皮石斛的抗氧化、保濕功效研究和應用現狀
評論
0/150
提交評論