在以前自己使用的xml較少,只是瞭解其很強大,現在可算是在DRP中,真正的開始使用它了,以前只是簡單的理解xml,xml即可延伸標記語言 (XML),簡單的使用,具體是什嗎?怎麼用?還是一直讓自己期待的.
首先來看一下xml的強大的作用
一、相容現有協議
XML文檔格式的管理資訊可以很容易地通過HTTP 協議傳輸,由於HTTP是建立在TCP之上的,故管理資料能夠可靠傳輸。XML還支援訪問XML文檔的標準API,如DOM,SAX,XSLT,Xpath等。
二、統一的管理資料存取格式
XML能夠以靈活有效方式定義管理資訊的結構。以XML格式儲存的資料不僅有良好的內在結構,而且由於它是W3C提出的國際標準,因而受到廣大軟體供應商的支援,易於進行資料交流和開發。現有網路管理標準如TMN、SNMP等的管理資訊庫規範決定了網管資料符合階層和物件導向原則,這使得以XML格式儲存網管資料也非常自然,易於實現。
三、不同應用系統間資料的共用和互動
只要定義一套描述各項管理資料和管理功能的XML語言,用Schema對這套語言進行規定,並且共用這些資料的系統的XML文檔遵從這些Schema,那麼管理資料和管理功能就可以在多個應用系統之間共用和互動。
四、底層傳輸的資料更具可讀性
網路中傳輸的底層資料因協議不同而編碼規則不同,雖然最終傳輸時都是二進位位流,但是不同的應用協議需要提供不同的轉換機制。這種情況導致管理站在對採用不同協議發送管理資訊的被管對象之間進行管理時很難實現相容。如果協議在資料表示時都採用XML格式進行描述,這樣網路之間傳遞的都是簡單的字元流,可以通過相同的XML解析器進行解析,然後根據不同的XML標記,對資料的不同部分進行區分處理,使底層資料更具可讀性。[4]
五、它和json都是一種資料交換格式
在不同的資料庫與系統間的互動,資料的相互共用其解決了很大的問題,不同語言開發的系統也可以使用xml來共用資料;
xml可以當然資料庫的表,來儲存資料,因為其都有一定的結構,結點,分層次的,很有規律,這樣我們以前來回傳遞資料可以借鑒xml來實現……
既然xml的作用這麼重要,如何解析xml、資料庫的資料取出來產生xml,這是首要解決的問題,結合在DRP中,為了實現資料庫的地址、使用者名稱、密碼都是靈活的通過xml來擷取,顯然系統後期的維護與修改顯得很輕鬆。
Dom4j是什嗎?
Dom4j是一個便於使用的,開源的庫,在Java平台上與XML,XPath,XSLT協同工作。使用Java集合架構,全面支援DOM,SAX,JAXP。
dom4j是一個Java的XMLAPI,類似於jdom,用來讀寫XML檔案的。dom4j是一個非常非常優秀的JavaXMLAPI,具有效能優異、功能強大和極端易用使用的特點,同時它也是一個開放原始碼的軟體,可以在SourceForge上找到它。
Dom4j執行個體解析XML
要讀取解析的xml檔案:sys-config.xml
<?xml version="1.0" encoding="UTF-8"?><config><db-info><driver-name>oracle.jdbc.driver.OracleDriver</driver-name><url>jdbc:oracle:thin:@127.0.0.1:1521:ORCL</url><user-name>sys</user-name><password>sys</password></db-info></config>
讀取xml檔案的類:XmlConfigReader.java
讀寫XML文檔主要依賴於org.dom4j.io包,其中提供DOMReader和SAXReader兩類不同方式,而調用方式是一樣的。這就是依靠介面的好處。
import java.io.InputStream;//引用相應的包import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;
讀取xml的java類:XmlConfigReader
代碼中reader的read方法是重載的,可以通過InputStream, File, Url等不同的參數來讀取,通過單例模式產生一個對象,這個對象執行個體化一個SAXReader,然後將xml檔案載入到流當中。再通過SAXReader的read()方法將其轉換成一個document對象。然後通過這個document對象取到xml檔案的節點的值。
package conn.lishehe.drp.util;import java.io.InputStream;//引用相應的包import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;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 {//取得jdbc相關配置資訊//通過流來讀取xml檔案 Document doc = reader.read(in);//讀取jdbc相關資訊//Element:用於描述XML文檔中的元素。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");/*String driverName = driverNameElt.getStringValue();String url = urlElt.getStringValue();String userName = userNameElt.getStringValue();@SuppressWarnings("unused")String password = passwordElt.getStringValue();System.out.println(driverName);*///取得jdbc相關的配置jdbcConfig.setDriverName(driverNameElt.getStringValue());jdbcConfig.setUrl(urlElt.getStringValue());jdbcConfig.setUserName(userNameElt.getStringValue());jdbcConfig.setPassword(passwordElt.getStringValue());} catch (DocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static synchronized XmlConfigReader getInstance(){if(instance == null){instance = new XmlConfigReader();}return instance;}/** * 返回jdbc相關配置 * @return */public JdbcConfig getJdbcConfig(){return jdbcConfig;}public static void main(String[] args){JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();/*System.out.println(jdbcConfig.getDriverName());System.out.println(jdbcConfig.getUrl());System.out.println(jdbcConfig.getUserName());*/System.out.println(jdbcConfig);}}
定義的實體集的類:JdbcConfig.java
package conn.lishehe.drp.util;/** * Jdbc * @author lishe * */public class JdbcConfig {private String driverName;public String getDriverName() {return driverName;}public void setDriverName(String driverName) {this.driverName = driverName;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}private String url;private String userName;private String password;@Overridepublic String toString() {return this.getClass().getCanonicalName() + "{driverName:" + driverName + ", url:" + url + ", userName:" + userName + "}";}}
資料處理層:DbUtil.java
package conn.lishehe.drp.util;import java.sql.Connection;import java.sql.DriverManager;/** * 封裝資料庫常用操作 * @author 李社河 */public class DbUtil {/** * 取得Connection * @return * @throws ClassNotFoundException */public static Connection getConnection() throws ClassNotFoundException{/*Connection conn = null;try {Class.forName("oracle.jdbc.driver.OracleDriver");String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";String username = "";String password = "";conn = DriverManager.getConnection(url, username,password);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return conn;*/Connection conn = null;try {JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();Class.forName(jdbcConfig.getDriverName());conn = DriverManager.getConnection(jdbcConfig.getUrl(), jdbcConfig.getUserName(),jdbcConfig.getPassword());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return conn;}public static void main(String[] args){try {//測試擷取到相應的設定檔的資訊,打出來System.out.println(DbUtil.getConnection());} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
執行結果:
當然另外值得一提的是DOM4J對XPath有良好的支援,如訪問一個節點,可直接用XPath選擇:
//Element:用於描述XML文檔中的元素。Element driverNameElt = (Element)doc.selectObject("/config/db-info/driver-name");Element urlElt = (Element)doc.selectObject("/config/db-info/url");
這裡使用的是selectObject方法,此方法返回找到的第一個匹配節點,如果沒有匹配的節點就返回 null。XPath更像一種選取器,只要你給出條件即可。
總結
通過以上的一些方法,我們可以得到
XML
整個文檔、文檔的根節點、符合某個條件的所有節點以及單獨拿到某個節點,都是可以的,這樣xml帶給系統的靈活性是非常強大的,Dom4j使得Java讀取XML檔案更加的方便,更加的快捷,效率更高,聯絡到項目中可以把相應的頁面資訊在資料庫的地址,讀取成xml檔案,在許可權的基礎上來判定載入相應的結點,生產相應的許可權樹是不錯的選擇啊……這樣聯絡想起來又勾起了我做項目的衝動哈!