天天看點

使用JDOM解析XML文檔

    說到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,如需轉載請自行聯系原作者