dom4j的使用及常見問題

相信做爲一個開發人員應該對XML與JSON 很是熟悉。關於二者的介紹與區別網上已經有不少資料,java對於XML的解析也有不少工具包,主要解析的方式有三種:java

1.DOM解析方式:適用於解析小型XML文件,若是操做大型XML文件,將整個Docment讀入內存可能會引發內存不足。git

2.SAX解析方式:對內存佔用較小,適合解析大型XML文件,說白了就是掃描解析。github

3.Digester/JAXB: Struts 的 XML 解析工具 Digester。dom

本文主要介紹dom4j的使用,dom4j中已經整合了SAX方式。使用dom4j能夠應對大型XML文件的操做。對於Digester筆者沒有過多的接觸,這裏就不作過多的說明。ide

下面來看dom4j的使用。工具

一.登陸官網http://www.dom4j.org/編碼

若是找不到下載位置能夠去github下載 (http://dom4j.github.io/code

二.將下載的壓縮包解壓。會看到(dom4j-1.6.1.jar)包,將jar包導入工程即可。orm

三.簡單的讀寫操做,如下是操做代碼:xml

public class XMLTest {  
    String fileName = "d:/test/test.xml";  
    @Test  
    public void testWriteXML(){  
        try {  
            OutputFormat format = OutputFormat.createPrettyPrint();//建立格式化類  
            format.setEncoding("UTF-8");//設置編碼  
            format.setIndent(true);//是否縮進  
            format.setNewlines(true);//是否換行  
            XMLWriter xmlWriter = new XMLWriter(new FileWriter(fileName), format);  
            //若是須要設置文件編碼格式,則須要使用一下方式建立writer   (1)  
            //xmlWriter = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File(fileName)), "UTF-8"), format);  
            Document document = DocumentHelper.createDocument();//經過DocumentHelper工具類建立document  
            Element root = document.addElement("root");  
            root.addElement("item").addAttribute("type", "t").addText("text");  
            xmlWriter.write(document);  
            xmlWriter.close();//必定要關閉 (2)  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
//  @Test  
    public void testReadXML(){//將XML文件一次性讀取  
        SAXReader reader = new SAXReader();  
        try {  
            Document document = reader.read(new FileReader(fileName));  
            Element root = document.getRootElement();  
            for(Iterator<?> i = root.elementIterator(); i.hasNext();){//遍歷節點  
                Element ele = (Element) i.next();  
                System.out.println(ele.asXML());  
            }  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (DocumentException e) {  
            e.printStackTrace();  
        }  
    }  
  
        @Test  
    public void testWriteXML1(){//寫入較大XML文件時,建議使用如下方式  
        try {  
            OutputFormat format = OutputFormat.createPrettyPrint();  
            format.setEncoding("UTF-8");//設置編碼  
            format.setIndent(true);//是否縮進  
            format.setNewlines(true);//是否換行  
            XMLWriter xmlWriter = new XMLWriter(new FileWriter(fileName), format);  
            Document document = DocumentHelper.createDocument();//經過DocumentHelper工具類建立document  
            xmlWriter.write(document);  
            Element root = document.addElement("root");  
            Element item = DocumentHelper.createElement("item");  
            xmlWriter.writeOpen(root);//準備寫入  
            for(int i=0;i<1000000;i++){  
                item.addAttribute("type", "type"+i).addText("text"+i);  
                item.setParent(root);  
                xmlWriter.write(item);//寫入節點  
                item.clearContent();//清空節點屬性  
            }  
            xmlWriter.writeClose(root);//寫入完成  
            xmlWriter.close();//必定要關閉  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
    @Test  
    public void testSAXReader(){//掃描方式讀取XML文件,須要實現ElementPath 接口,在該接口中進行邏輯處理  
        SAXReader reader = new SAXReader();  
        reader.setDefaultHandler(new ElementHandler() {  
            @Override  
            public void onStart(ElementPath elementPath) {  
                Element element = elementPath.getCurrent();  
                if("item".equals(element.getName())){  
                    System.out.println(element.attributeValue("type"));  
                    System.out.println(element.getText());//沒有獲取Text值(3)  
                }  
            }  
              
            @Override  
            public void onEnd(ElementPath elementPath) {  
                Element element = elementPath.getCurrent();  
                if("item".equals(element.getName())){  
                    System.out.println(element.attributeValue("type"));  
                    System.out.println(element.getText());  
                }  
            }  
        });  
        try {  
            reader.read(new FileReader(fileName));  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (DocumentException e) {  
            e.printStackTrace();  
        }  
    }  
}

四:注意事項:

(1):生成XML文件編碼,若是有中文須要注意此處配置。

(2):必定記得關閉write。

(3):ElementHandler接口,須要實現onStart(初始化操做),onEnd方法(處理邏輯),這裏注意在onStart方法中將沒法得到節點的Text值(多是沒有讀完操做)。

 

註明:若是須要更詳細的介紹,請參考官方文檔

參考:http://www.ibm.com/developerworks/cn/xml/dm-1208gub/

相關文章
相關標籤/搜索