使用DOM4J读和写文档
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
dom4j使用的解析器對象都是由其他包提供的,雖然它可以使用不同的解析器(SAX,DOM,StAX等),但通常使用的是SAX。
解析文檔
dom4j不是一個XML解析器,它必須使用獨(dú)立的解析器來創(chuàng)建Document對象。通常,你可以通過dom4j中的org.dom4j.io.SAXReader類來使用SAX解析器。調(diào)用SAXReader的read()方法將創(chuàng)建一個org.xml.sax.XMLReader類的實(shí)例,并且通過它實(shí)現(xiàn)的ContentHandler接口調(diào)用DocumentFactory創(chuàng)建dom4j對象樹。解析java.io.File對象的代碼如下:
//假設(shè)我們獲得了一個路徑作為命令行參數(shù) File?file?=?new?File(args[0]); SAXReader?reader?=?new?SAXReader(); Document?doc?=?reader.read(file);在創(chuàng)建SAXReader實(shí)例時,通過使用不同的構(gòu)造器參數(shù)來確定(更確切地說,SAXReader是由下層的SAX解析器來確認(rèn)),是使用預(yù)備的DocumentFactory實(shí)現(xiàn),還是特定的SAX實(shí)現(xiàn)。此外,在SAXReader對象中還有各種setter方法(setValidating(),setDocumentFactory()等)來設(shè)置這些屬性和其他的屬性。可以參考dom4j的javadoc完整文檔信息。read()方法是一個重載方法,它能接收下面輸入?yún)?shù)中的一項(xiàng):
A java.io.File object
A java.net.URL object
A system ID as a String object (which could be a URL or a filename)
A java.io.InputStream object
A java.io.Reader object
A java.io.InputStream object and? a system ID resolving relative URLs
A java.io.Reader object and a system ID for resolving relative URLs
An org.xml.sax.InputSource object
如果將一個String對象當(dāng)作XML來解析,你可以把這個String對象封裝在java.io.StringReader中,也可以把它傳送給一個實(shí)用方法DocumentHelper.parseText()。parseText()方法將確定正確的編碼,解析String對象,并返回一個Document對象。
使用dom4j解析XML文檔示例:
package?org.wangwa;import?java.io.File; import?java.util.List;import?org.dom4j.Document; import?org.dom4j.DocumentException; import?org.dom4j.Element; import?org.dom4j.io.SAXReader; /*解析XML文檔簡單示例*/ public?class?Dom4jParseXml?{@SuppressWarnings("rawtypes")public?static?void?main(String[]?args)?{File?file?=?new?File("/home/fuhd/apk/gw/a"?+?"/com.application.zomato.apk/AndroidManifest.xml");SAXReader?reader?=?new?SAXReader();try?{Document?doc?=?reader.read(file);Element?root?=?doc.getRootElement();List?listE?=?root.elements("uses-feature");if(listE?!=?null){for(Object?e?:?listE){System.out.println(((Element)e).asXML());}}}?catch?(DocumentException?e)?{e.printStackTrace();}} }創(chuàng)建Document對象
Document對象的創(chuàng)建可以由DocumentFactory類或者它的子類來完成。DocumentHelper類也提供一些靜態(tài)方法,用來創(chuàng)建Document,Element,Attribute等對象。這些靜態(tài)方法調(diào)用DocumentFactory實(shí)例中相對應(yīng)的方法。為了簡化,你可以這樣寫:
DocumentFactory?factory?=?DocumentFactory.getInstance(); Document?doc?=?factory.createDocument();你也可以寫成這樣:
Document?doc?=?DocumentHelper.createDocument();因?yàn)闆]有直接使用DocumentFactory對象,因此只保留了一行代碼,但是,我們失去了使用不同工廠類的這一優(yōu)勢,這將是我們稍后進(jìn)行深入討論的內(nèi)容。
一旦創(chuàng)建了Document對象,使用add()方法增加節(jié)點(diǎn)是件非常容易的事。根據(jù)XML規(guī)范,可以根據(jù)自己的要求添加多個Comment和ProcessingInstruction對象到Document中,但只能有一個Element。除add()方法外,在Document的父接口Branch中還定義了一組名稱為addElement()方法,這些方法可以接收QName對象,本地名稱或者是本地名稱和命名空間的URI。當(dāng)你調(diào)用一個addElement()方法時,DocumentFactory的createElement()方法將會被調(diào)用,而且這個Element對象將會被設(shè)置成為Document對象的根元素。因此,這里的兩塊代碼做的是相同的事情:
//塊1:完整方法 Element?myElement?=?factory.createElement("name"); doc.add(myElement); //塊2:簡短方式 doc.addElement("name");addElement()方法返回的是一個新創(chuàng)建的對象,它允許你像這樣鏈?zhǔn)降卣{(diào)用方法:
doc.addElement("root").addElement("child").addElement("innerChild");生成的文檔應(yīng)該是這樣:
<root><child><innerChild?/></child> </root>名稱空間和限定名????????????在dom4j中,對于其他XML API,元素的名稱和屬性是用一個三元組來表示的:本地名,名稱空間前綴和名稱空間URI來表示的。名稱空間前綴和名稱空間URI都封裝在org.dom4j.Namespace類中,而它自己又被封裝在org.dom4j.QName中。Namespace和QName被實(shí)例化后,它們的屬性就不可更改了,雖然它們都提供了公共的構(gòu)造方法,但最好是通過類的靜態(tài)方法get()方法來實(shí)例化這兩個實(shí)例。get()方法利用了對象緩存,這樣當(dāng)使用相同參數(shù)重復(fù)調(diào)用get()方法時,就可以返回相同的對象,從而降低內(nèi)存消耗,加快了對象比較的速率,增加了XML的一致性。
輸出文檔
在dom4j中輸出文檔既包含了對XML的序列化,還包含了將dom4j對象傳遞給其他的XML APIs(非dom4j的API)。dom4j采用了最為簡單的機(jī)制將Document對象轉(zhuǎn)換成String對象:
String?output?=?doc.asXML();就是這樣,asXML()方法是Node接口的一部分,因此,它在dom4j對象模型中的每一個接口中都有效。asXML()方法不能進(jìn)行格式化的輸出,除Document對象之外,它使用的字符集編碼總是UTF-8。如果你想要設(shè)置自己的輸出格式,就需要使用org.dom4j.io.XMLWriter類。XMLWriter將輸出格式以XML對象的形式寫入到j(luò)ava.io.Writer對象,或者是java.io.InputStream對象。當(dāng)你創(chuàng)建一個XMLWriter實(shí)例時,就可以使用org.dom4j.io.OutputFormat對象來控制XML對象的輸出格式。dom4J包含了三種格式:
Default:由new OutputFormat()創(chuàng)建,Raw格式。沒有縮進(jìn)或增加換行符。XML聲明的編碼總是寫在新的一行中。
Pretty Print:由OutputFormat.createPrettyPrint()創(chuàng)建,會在元素之間產(chǎn)生兩個空格的縮進(jìn),并且產(chǎn)生換行符。文本會被裁剪,使之標(biāo)準(zhǔn)化。
Compact:由OutputFormat.createCompactFormat()創(chuàng)建,默認(rèn)格式是對文本進(jìn)行微調(diào),增強(qiáng)文本格式的標(biāo)準(zhǔn)化。
你可以傳入OutputFormat對象到XMLWriter構(gòu)造器中。可是XMLWriter并沒有setOutputFormat()或getOutputFormat()這些方法集,這樣就不能再更改XMLWriter的格式了。你創(chuàng)建OutputFormat對象,并把它傳遞給XMLWriter構(gòu)造器,然后再去調(diào)用OutputFormat實(shí)例中的mutator方法。但是不推薦這么做,因?yàn)檫@會導(dǎo)致行為不一致。在創(chuàng)建XMLWriter之前,要配置好OutputFormat對象,以免出錯。實(shí)際上,OutputFourmat對象能定制出遠(yuǎn)超出這三種默認(rèn)格式的輸出格式。事實(shí)上,它可以作為這些定義的模板,這里我們就不做介紹了。
創(chuàng)建Document對象并輸出的示例:
package?org.wangwa;import?java.io.BufferedOutputStream; import?java.io.File; import?java.io.FileOutputStream; import?java.io.IOException; import?java.io.UnsupportedEncodingException; import?org.dom4j.Document; import?org.dom4j.DocumentHelper; import?org.dom4j.io.OutputFormat; import?org.dom4j.io.XMLWriter;public?class?CreateDocument?{public?static?void?main(String[]?args)?{Document?doc?=?DocumentHelper.createDocument();doc.addElement("class").addElement("student").addAttribute("name",?"fuhd").addText("這是個好學(xué)生");//OutputFormat?format?=?new?OutputFormat();??????????????????????????????????????//創(chuàng)建Raw格式,默認(rèn)OutputFormat?format?=?OutputFormat.createPrettyPrint();???????????????????//創(chuàng)建Pretty?Print格式//OutputFormat?format?=?OutputFormat.createCompactFormat();????????//創(chuàng)建Compact格式try?{XMLWriter?writer?=?new?XMLWriter(format);writer.setOutputStream(new?BufferedOutputStream(new?FileOutputStream(new?File("/home/fuhd/student")))?);writer.write(doc);}?catch?(UnsupportedEncodingException?e1)?{e1.printStackTrace();}?catch?(IOException?e2)?{e2.printStackTrace();}?catch?(Exception?e3)?{e3.printStackTrace();}} }轉(zhuǎn)載于:https://my.oschina.net/fhd/blog/368769
總結(jié)
以上是生活随笔為你收集整理的使用DOM4J读和写文档的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 示例在同一台机器上使用RMAN克隆数据库
- 下一篇: CodeIgniter_2.2.0整合s