使用DOM4J读和写文档
為什么80%的碼農都做不了架構師?>>> ??
dom4j使用的解析器對象都是由其他包提供的,雖然它可以使用不同的解析器(SAX,DOM,StAX等),但通常使用的是SAX。
解析文檔
dom4j不是一個XML解析器,它必須使用獨立的解析器來創建Document對象。通常,你可以通過dom4j中的org.dom4j.io.SAXReader類來使用SAX解析器。調用SAXReader的read()方法將創建一個org.xml.sax.XMLReader類的實例,并且通過它實現的ContentHandler接口調用DocumentFactory創建dom4j對象樹。解析java.io.File對象的代碼如下:
//假設我們獲得了一個路徑作為命令行參數 File?file?=?new?File(args[0]); SAXReader?reader?=?new?SAXReader(); Document?doc?=?reader.read(file);在創建SAXReader實例時,通過使用不同的構造器參數來確定(更確切地說,SAXReader是由下層的SAX解析器來確認),是使用預備的DocumentFactory實現,還是特定的SAX實現。此外,在SAXReader對象中還有各種setter方法(setValidating(),setDocumentFactory()等)來設置這些屬性和其他的屬性。可以參考dom4j的javadoc完整文檔信息。read()方法是一個重載方法,它能接收下面輸入參數中的一項:
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對象當作XML來解析,你可以把這個String對象封裝在java.io.StringReader中,也可以把它傳送給一個實用方法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();}} }創建Document對象
Document對象的創建可以由DocumentFactory類或者它的子類來完成。DocumentHelper類也提供一些靜態方法,用來創建Document,Element,Attribute等對象。這些靜態方法調用DocumentFactory實例中相對應的方法。為了簡化,你可以這樣寫:
DocumentFactory?factory?=?DocumentFactory.getInstance(); Document?doc?=?factory.createDocument();你也可以寫成這樣:
Document?doc?=?DocumentHelper.createDocument();因為沒有直接使用DocumentFactory對象,因此只保留了一行代碼,但是,我們失去了使用不同工廠類的這一優勢,這將是我們稍后進行深入討論的內容。
一旦創建了Document對象,使用add()方法增加節點是件非常容易的事。根據XML規范,可以根據自己的要求添加多個Comment和ProcessingInstruction對象到Document中,但只能有一個Element。除add()方法外,在Document的父接口Branch中還定義了一組名稱為addElement()方法,這些方法可以接收QName對象,本地名稱或者是本地名稱和命名空間的URI。當你調用一個addElement()方法時,DocumentFactory的createElement()方法將會被調用,而且這個Element對象將會被設置成為Document對象的根元素。因此,這里的兩塊代碼做的是相同的事情:
//塊1:完整方法 Element?myElement?=?factory.createElement("name"); doc.add(myElement); //塊2:簡短方式 doc.addElement("name");addElement()方法返回的是一個新創建的對象,它允許你像這樣鏈式地調用方法:
doc.addElement("root").addElement("child").addElement("innerChild");生成的文檔應該是這樣:
<root><child><innerChild?/></child> </root>名稱空間和限定名????????????在dom4j中,對于其他XML API,元素的名稱和屬性是用一個三元組來表示的:本地名,名稱空間前綴和名稱空間URI來表示的。名稱空間前綴和名稱空間URI都封裝在org.dom4j.Namespace類中,而它自己又被封裝在org.dom4j.QName中。Namespace和QName被實例化后,它們的屬性就不可更改了,雖然它們都提供了公共的構造方法,但最好是通過類的靜態方法get()方法來實例化這兩個實例。get()方法利用了對象緩存,這樣當使用相同參數重復調用get()方法時,就可以返回相同的對象,從而降低內存消耗,加快了對象比較的速率,增加了XML的一致性。
輸出文檔
在dom4j中輸出文檔既包含了對XML的序列化,還包含了將dom4j對象傳遞給其他的XML APIs(非dom4j的API)。dom4j采用了最為簡單的機制將Document對象轉換成String對象:
String?output?=?doc.asXML();就是這樣,asXML()方法是Node接口的一部分,因此,它在dom4j對象模型中的每一個接口中都有效。asXML()方法不能進行格式化的輸出,除Document對象之外,它使用的字符集編碼總是UTF-8。如果你想要設置自己的輸出格式,就需要使用org.dom4j.io.XMLWriter類。XMLWriter將輸出格式以XML對象的形式寫入到java.io.Writer對象,或者是java.io.InputStream對象。當你創建一個XMLWriter實例時,就可以使用org.dom4j.io.OutputFormat對象來控制XML對象的輸出格式。dom4J包含了三種格式:
Default:由new OutputFormat()創建,Raw格式。沒有縮進或增加換行符。XML聲明的編碼總是寫在新的一行中。
Pretty Print:由OutputFormat.createPrettyPrint()創建,會在元素之間產生兩個空格的縮進,并且產生換行符。文本會被裁剪,使之標準化。
Compact:由OutputFormat.createCompactFormat()創建,默認格式是對文本進行微調,增強文本格式的標準化。
你可以傳入OutputFormat對象到XMLWriter構造器中。可是XMLWriter并沒有setOutputFormat()或getOutputFormat()這些方法集,這樣就不能再更改XMLWriter的格式了。你創建OutputFormat對象,并把它傳遞給XMLWriter構造器,然后再去調用OutputFormat實例中的mutator方法。但是不推薦這么做,因為這會導致行為不一致。在創建XMLWriter之前,要配置好OutputFormat對象,以免出錯。實際上,OutputFourmat對象能定制出遠超出這三種默認格式的輸出格式。事實上,它可以作為這些定義的模板,這里我們就不做介紹了。
創建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("這是個好學生");//OutputFormat?format?=?new?OutputFormat();??????????????????????????????????????//創建Raw格式,默認OutputFormat?format?=?OutputFormat.createPrettyPrint();???????????????????//創建Pretty?Print格式//OutputFormat?format?=?OutputFormat.createCompactFormat();????????//創建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();}} }轉載于:https://my.oschina.net/fhd/blog/368769
總結
以上是生活随笔為你收集整理的使用DOM4J读和写文档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 示例在同一台机器上使用RMAN克隆数据库
- 下一篇: CodeIgniter_2.2.0整合s