说到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">
    </bean>
    <!-- 可以把所有的需要创建的类配置进来 -->
  </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) {
      e.printStackTrace();
    }
  }
}