菜鳥學Java(八)——dom4j詳解之讀取XML文件


dom4j是一個Java的XML API,類似於jdom,用來讀寫XML文件的。dom4j是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件,現在越來越多的Java軟件都在使用dom4j來讀寫XML,特別值得一提的是連Sun的JAXM也在用dom4j。這是必須使用的jar包。


上面說dom4j這么優秀,那么好用,那么從今天開始就跟大家一起分享dom4j的一些用法。


 

dom4j的主要接口都在org.dom4j這個包里定義:

 
Attribute
Attribute定義了XML的屬性
Branch
Branch為能夠包含子節點的節點如XML元素(Element)和文檔(Docuemnts)定義了一個公共的行為,
CDATA
CDATA 定義了XML CDATA 區域
CharacterData
CharacterData是一個標識借口,標識基於字符的節點。如CDATA,Comment, Text.
Comment
Comment 定義了XML注釋的行為
Document
定義了XML文檔
DocumentType
DocumentType 定義XML DOCTYPE聲明
Element
Element定義XML 元素
ElementHandler
ElementHandler定義了 Element 對象的處理器
ElementPath
被 ElementHandler 使用,用於取得當前正在處理的路徑層次信息
Entity
Entity定義 XML entity
Node
Node為所有的dom4j中XML節點定義了多態行為
NodeFilter
NodeFilter 定義了在dom4j節點中產生的一個濾鏡或謂詞的行為(predicate)
ProcessingInstruction
ProcessingInstruction 定義 XML 處理指令.
Text
Text 定義XML 文本節點.
Visitor
Visitor 用於實現Visitor模式.
XPath
XPath 在分析一個字符串后會提供一個XPath 表達式


 


 

要想弄懂這套接口,關鍵的是要明白接口的繼承關系:

 

 

讀寫XML文檔主要依賴於org.dom4j.io包,其中提供DOMReader和SAXReader兩類不同方式,而調用方式是一樣的。這就是依靠接口的好處。

 

// 從文件讀取XML,輸入文件名,返回XML文檔
public Document read(String fileName) throws MalformedURLException, DocumentException {
       SAXReader reader = new SAXReader();
       Document document = reader.read(new File(fileName));
       return document;
}

 

reader的read方法是重載的,可以通過InputStream, File, Url等不同的參數來讀取。得到的Document對象就帶表了整個XML。
根據本人自己的經驗,讀取的字符編碼是按照XML文件頭定義的編碼來轉換。如果遇到亂碼問題,注意要把各處的編碼名稱保持一致即可。

 


下面這個例子是SAXReader類通過InputStream讀取xml文件:


所要讀取的xml文件:

 

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <db-info>
        <driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
        <url>jdbc:oracle:thin:@localhost:1522:mydb</url>
        <user-name>drp</user-name>
        <password>drp</password>
    </db-info>
</config>

 


讀取xml文件的類:

 

package com.util;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 解析sys-config.xml文件
 * @author Ronaldinho
 *
 */

public class XmlConfigReader {
    
    //懶漢式
    private static XmlConfigReader instance = null;
    
    //保存jdbc相關信息
    private JdbcConfig jdbcConfig = new JdbcConfig(); 
    
    private XmlConfigReader() {

        //建立一個SAXReader對象  
        SAXReader reader=new SAXReader();

        //通過當前線程的類加載器,獲得文件的相對路徑,讀入緩沖輸入流 
        InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");
        try {
            //通過流來讀取xml文件
            Document doc=reader.read(in);
            
            //讀取jdbc相關信息
            Element driverNameElt=(Element) doc.selectObject("/config/db-info/driver-name");
            Element urlElt=(Element) doc.selectObject("/config/db-info/url");
            Element userNameElt=(Element) doc.selectObject("/config/db-info/user-name");
            Element passwordElt=(Element) doc.selectObject("/config/db-info/password");
            
            //設置jdbc相關信息
            jdbcConfig.setDrivername(driverNameElt.getStringValue());
            jdbcConfig.setUrl(urlElt.getStringValue());
            jdbcConfig.setUsername(userNameElt.getStringValue());
            jdbcConfig.setPassword(passwordElt.getStringValue());

        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
    
    public static synchronized XmlConfigReader getInstance() {
        if (instance==null) {
            instance = new XmlConfigReader();
        }
        return instance;
    }
}

 


上面這種方式是通過單例模式生成一個對象,這個對象實例化一個SAXReader,然后將xml文件加載到流當中。再通過SAXReader的read()方法將其轉換成一個document對象。然后通過這個document對象取到xml文件的節點的值。


今天就先簡單介紹一下利用dom4j讀取xml文件,后面會陸續跟大家說說其他的用法。大家不要着急哦。


PS:歡迎各位批評指正!


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM