說到XML,恐怕我們最深刻的印象也就是滿眼的配置檔案了,其實使用XML來交換資料也是比較常見的,我想就是因為它的靈活性好通用性強便于傳輸等原因吧。這樣,對XML檔案的解析就顯得特别重要了,就好像我們的JDBC從資料庫拿資料一樣。解析xml檔案的技術有很多,我通常都是使用JDOM。
我要講的這個例子是基于這樣簡易Bean工廠類思想,把類及其實作的接口配置到XML中,工廠(其實就是一個Map)基于這個配置檔案來存儲類的執行個體,對于Map中的每個元素都是類的一個執行個體,其中接口作鍵,利用反射生成相應的對象作值,使用者可以把此Map作為一個容器來取得目标類的執行個體。
1.XML檔案:configure.xml
<?xml version="1.0" encoding="UTF-8"?>
<sys-configure>
<jdbc-info>
<driver-class-name>
oracle.jdbc.driver.OracleDriver
</driver-class-name>
<url>jdbc:oracle:thin:@127.0.0.1:1521:test</url>
<user-name>scott</user-name>
<password>yf123</password>
</jdbc-info>
<beans>
<bean id="com.yangfei.jdom.read.TestDao"
class="com.yangfei.jdom.read.TestDaoImpl">
</bean>
<bean id="com.yangfei.jdom.read.TestService"
class="com.yangfei.jdom.read.TestServiceImpl">
<!-- 可以把所有的需要建立的類配置進來 -->
</beans>
</sys-configure>
2.事例接口及其實作類:
package com.yangfei.jdom.read;
public interface TestDao {
public void test();
}
public class TestDaoImpl implements TestDao {
public void test() {
System.out.println("print from TestDaoImpl");
}
public interface TestService {
public void t();
public class TestServiceImpl implements TestService {
public void t() {
System.out.println("print from TestService");
}
3.解析類:Test.java
public class Test {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Map beanMap = new HashMap();// 用來存放從xml檔案中取出的id和classname對用的對象
SAXBuilder sb = new SAXBuilder();
Document doc = null;
try {
doc = sb.build(Thread.currentThread()
.getContextClassLoader()
.getResourceAsStream("configure.xml"));// 以相對目錄來讀取檔案
Element rootElt = doc.getRootElement();
List<Element> Elts = XPath.selectNodes(rootElt,"//sys-configure/beans/bean");
for (Element elt : Elts) {
String id = elt.getAttributeValue("id");
String className = elt.getAttributeValue("class");
System.out.println(id + "@@@" + className);
// 取出之後生成實作類的具體對象,以接口為鍵,以實作類對象為值存放在Map裡
Object obj = Class.forName(className).newInstance();
beanMap.put(id, obj);// 以後使用類對象時就可以通路Map來取得對象了.
}
} catch (JDOMException e) {
e.printStackTrace();
} catch (Exception e) {
}
本文轉自NightWolves 51CTO部落格,原文連結:http://blog.51cto.com/yangfei520/299661,如需轉載請自行聯系原作者