毫无疑问java中的DOM操作还是比较难使用,他是一个庞大的API,很难驾驭。并且在是使用的时候需要消耗更多的内存和要依赖与更高的主频。

使用的类包有:

尝试使用Jdom_读取XML文件

   编写一个简单的XML文件如下:

 

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <sys> 
  3.     <jdbc> 
  4.         <jdbc-driver>com.mircosoft.sql.sqlServer.SQLServerDriver</jdbc-driver> 
  5.         <jdbc-url>jdbc:sqlserver://localhost:1433;dataName="ext"</jdbc-url>  
  6.         <jdbc-user>sa</jdbc-user> 
  7.         <jdbc-password>sa</jdbc-password> 
  8.     </jdbc> 
  9.     <person nation="zh_CN"> 
  10.         <person-object id="1"> 
  11.             <person-name>Zhubajie</person-name> 
  12.             <person-age>23</person-age> 
  13.             <person-address>Xi'an</person-address> 
  14.         </person-object> 
  15.         <person-object id="2"> 
  16.             <person-name>Shasidi</person-name> 
  17.             <person-age>24</person-age> 
  18.             <person-address>Xi'an</person-address> 
  19.         </person-object> 
  20.     </person> 
  21. </sys> 

1.如果将jdbc结点中的子节点的元素封装为一个数据对象,那么java操作数据库的数据库连接就可以通过配置相应的XML文件就可实现,这样就可一不用动java源代码。

2.如果将person当作一个集合的话,那么这个集合就有两个对象。

3.如果将person当作一个父类的话,那么有两个子类继承了person,子类的描述如:

<person-object id="XX">构成

4.如果单独去看待<person-object id="XX">的话,相当于一个实体类的一个实例对象,对象的人为标识用id来表示,对象有name,age,address属性。

    通过反射机制就可以通过读取XML文件的配置信息来实例化类对象,类似与Spring中的依赖注入中当然注入对象。

下面是一个读取的实例:

采用单例模式,因为对于配置文件的读取一般都是当应用程序加载或者运行某一时刻是才使用。


  1. package xiao.zhang.jdom; 
  2.  
  3. import java.io.FileInputStream; 
  4. import java.io.FileNotFoundException; 
  5. import java.io.IOException; 
  6. import java.util.ArrayList; 
  7. import java.util.Iterator; 
  8. import java.util.List; 
  9.  
  10. import org.jdom.DataConversionException; 
  11. import org.jdom.Document; 
  12. import org.jdom.Element; 
  13. import org.jdom.JDOMException; 
  14. import org.jdom.input.SAXBuilder; 
  15.  
  16.  
  17. public class ReadXml { 
  18.  
  19.     /** 
  20.      * 配置文件路径 
  21.      */ 
  22.     private static String FILE_PATH = "C://jdbc-config.xml"
  23.  
  24.     /** 
  25.      * 采用单例模式,创建一个读取ReadXml实例 
  26.      *  
  27.      */ 
  28.  
  29.     private static ReadXml readXmlInstance = new ReadXml(); 
  30.  
  31.     /** 
  32.      * 文档的根元素 
  33.      */ 
  34.     private Element rootElt = null
  35.  
  36.     /** 
  37.      * 文档对象 
  38.      *  
  39.      */ 
  40.  
  41.     private Document doc = null
  42.  
  43.     /** 
  44.      * 私有的方法 
  45.      */ 
  46.     private ReadXml() { 
  47.         SAXBuilder sb = new SAXBuilder(); 
  48.         try { 
  49.             // 获取到文档对象 
  50.             this.doc = sb.build(new FileInputStream(FILE_PATH)); 
  51.             // 获取到XML文档的根 
  52.             this.rootElt = doc.getRootElement(); 
  53.         } catch (FileNotFoundException e) { 
  54.             e.printStackTrace(); 
  55.         } catch (JDOMException e) { 
  56.             e.printStackTrace(); 
  57.         } catch (IOException e) { 
  58.             e.printStackTrace(); 
  59.         } 
  60.     } 
  61.  
  62.     /** 
  63.      * 获得读取XML文件的实例 
  64.      *  
  65.      * @return 
  66.      */ 
  67.     public static ReadXml getInstance() { 
  68.         return readXmlInstance; 
  69.     } 
  70.  
  71.     /** 
  72.      *  
  73.      * 读取链接数据库的配置文件 
  74.      *  
  75.      * @return 
  76.      */ 
  77.     public JDBC getJDBC() { 
  78.         JDBC jdbc = new JDBC(); 
  79.         Element jdbcElt = this.rootElt.getChild("jdbc"); 
  80.         List<?> jdcbChildList = jdbcElt.getChildren(); 
  81.         List<String> jdbcTextTrim = new ArrayList<String>(); 
  82.         for (Iterator<?> iter = jdcbChildList.iterator(); iter.hasNext();) { 
  83.             Element elt = (Element) iter.next(); 
  84.             jdbcTextTrim.add(elt.getTextTrim()); 
  85.         } 
  86.         jdbc.setDriver(jdbcTextTrim.get(0)); 
  87.         jdbc.setUrl(jdbcTextTrim.get(1)); 
  88.         jdbc.setUser(jdbcTextTrim.get(2)); 
  89.         jdbc.setPassword(jdbcTextTrim.get(3)); 
  90.  
  91.         return jdbc; 
  92.     } 
  93.  
  94.     /** 
  95.      *  
  96.      * 根据数据库配置文件来获得数据库连接的相关信息 
  97.      *  
  98.      * @return 
  99.      */ 
  100.     public JDBC getJdbcFromConf() { 
  101.         JDBC jdbc = new JDBC(); 
  102.         Element jdbcElt = this.rootElt.getChild("jdbc"); 
  103.         jdbc.setDriver(jdbcElt.getChildText("jdbc-driver")); 
  104.         jdbc.setPassword(jdbcElt.getChildText("jdbc-password")); 
  105.         jdbc.setUrl(jdbcElt.getChildText("jdbc-url")); 
  106.         jdbc.setUser(jdbcElt.getChildText("jdbc-user")); 
  107.         return jdbc; 
  108.     } 
  109.  
  110.     public List<Person> getPersonList() { 
  111.         List<Person> personList = new ArrayList<Person>(); 
  112.         Element personElt = this.rootElt.getChild("person"); 
  113.         // 获得Person的属性nation的值 
  114.         String nation = personElt.getAttribute("nation").getValue(); 
  115.         // 获得Person节点下的所有节点元素 
  116.         List<?> personEltList = new ArrayList<Object>(); 
  117.         personEltList = personElt.getChildren(); 
  118.         Person p = null
  119.         for (Iterator<?> iter = personEltList.iterator(); iter.hasNext();) { 
  120.             p = new Person(); 
  121.             Element elt = (Element) iter.next(); 
  122.             try { 
  123.                 p.setId(elt.getAttribute("id").getIntValue()); 
  124.                 p.setName(elt.getChildTextTrim("person-name")); 
  125.                 p.setNation(nation); 
  126.                 p.setAge(Integer.parseInt(elt.getChildTextTrim("person-age"))); 
  127.                 p.setAddress(elt.getChildTextTrim("person-address")); 
  128.                 personList.add(p); 
  129.             } catch (DataConversionException e) { 
  130.                 e.printStackTrace(); 
  131.             } 
  132.         } 
  133.         return personList; 
  134.  
  135.     } 
  136.     /** 
  137.      * @return the fILE_PATH 
  138.      */ 
  139.     public static String getFILE_PATH() { 
  140.         return FILE_PATH; 
  141.     } 
  142.  
  143.     /** 
  144.      * @return the rootElt 
  145.      */ 
  146.     public Element getRootElt() { 
  147.         return this.rootElt; 
  148.     } 
  149.  
  150.     /** 
  151.      * @return the doc 
  152.      */ 
  153.     public Document getDoc() { 
  154.         return this.doc; 
  155.     } 
  156.  
  157.     /** 
  158.      * @param fILE_PATH 
  159.      *            the fILE_PATH to set 
  160.      */ 
  161.     public static void setFILE_PATH(String fILE_PATH) { 
  162.         FILE_PATH = fILE_PATH; 
  163.     } 
  164.  
  165.     /** 
  166.      * @param rootElt 
  167.      *            the rootElt to set 
  168.      */ 
  169.     public void setRootElt(Element rootElt) { 
  170.         this.rootElt = rootElt; 
  171.     } 
  172.  
  173.     /** 
  174.      * @param doc 
  175.      *            the doc to set 
  176.      */ 
  177.     public void setDoc(Document doc) { 
  178.         this.doc = doc; 
  179.     } 

测试的方法:


  1. public static void main(String[] args) { 
  2.         ReadXml rx = ReadXml.getInstance(); 
  3.         JDBC jdbc = null
  4.         jdbc = rx.getJdbcFromConf(); 
  5.         System.out.println("getJdbcFromConf:" + jdbc.toString()); 
  6.         jdbc = rx.getJDBC(); 
  7.         System.out.println("getJDBC:" + jdbc.toString()); 
  8.         List personList = rx.getPersonList(); 
  9.         for (Iterator iter = personList.iterator(); iter.hasNext();) { 
  10.             System.out.println(((Person) iter.next()).toString()); 
  11.         } 
  12.     } 


测试读取数据库连接的信息结果:


  1. getJdbcFromConf:JDBC [driver=com.mircosoft.sql.sqlServer.SQLServerDriver, url=jdbc:sqlserver://localhost:1433;dataName="ext", user=sa, password=sa] 
  2. getJDBC:JDBC [driver=com.mircosoft.sql.sqlServer.SQLServerDriver, url=jdbc:sqlserver://localhost:1433;dataName="ext", user=sa, password=sa] 

测试读取person结点的信息:


  1. Person [nation=zh_CN, id=1, name=Zhubajie, age=23, address=Xi'an] 
  2. Person [nation=zh_CN, id=2, name=Shasidi, age=24, address=Xi'an]