2011年8月26日 星期五

[ Java代碼範本 ] JDOM ( Java/xml ) 的使用範例


參考至 史帝芬心得筆記
前言 :
在Java的世界裡,要操控XML,最簡單的方法莫過於使用JDOM。在這裡我簡單的介紹如何用JDOM從無到有的建立一分XML、當有一份XML file時,如何將這個XML file讀進程式裡及如何利用JDOM將XML透過XSLT轉成HTML. JDOM是由Brett Mclaughlin和Jason Hunter編寫,在http://www.jdom.org可免費下載。

建立、新增、刪除、輸出 :
範例1展示如何建立、新增、刪除及輸出一份XML,每份XML在JDOM裡是由一個Document類別代表,所以一開始我們要先new一個Document,在建構Document時應指明根節點,如果沒有指明,在建構應由setRootElement設定。基本上XML都可以化成一個樹狀結構,所以,在產生根節點之後,就由根節點開始增加子節點,新增的方式是呼叫Element.addContent將新的節點加入。刪除如果知道是某節點以下的子節點,則可呼叫Element.getChildren取得所有子節點,再找出要刪除的點節予以刪除。

當建立好XML之後,通常我們會希望將它輸出到檔案,JDOM提供了XMLOutputter類別供我們輸出之用,輸出前要先設定編碼方式,不然,會以UTF-8為預設值,setNewlines則是指明輸出時是否要幫我們斷行,方便閱讀,如果沒有加這行指令,預設是不會斷行,那麼所有資料將在同一行上.
===== 範例 1 =====
  1. import org.jdom.*;  
  2. import org.jdom.output.*;  
  3. import java.io.*;  
  4. import java.util.List;  
  5.   
  6. public class myCreate {  
  7.   public myCreate() {  
  8.     String[] strChapter = { "XML簡論""編寫XML""剖析XML""約制XML""驗正XML""轉換XML" };  
  9.     Element elmtRoot = new Element("Article");  
  10.     Document docJDOM = new Document(elmtRoot);  
  11.     //新增  
  12.     for(int i=0; i<6; i++) {  
  13.       Element elmtChapter = new Element("Chapter");  
  14.       elmtChapter.addContent(strChapter[i]);  
  15.       elmtChapter.setAttribute("sort"new Integer(i).toString());  
  16.       elmtRoot.addContent(elmtChapter);  
  17.     }  
  18.   
  19.     //刪除  
  20.     List lstChapter = elmtRoot.getChildren("Chapter");  
  21.     lstChapter.remove(4);  
  22.     //輸出  
  23.     OutputXML(docJDOM, "e:/myJDOM.xml");  
  24.   }  
  25.   
  26.   private void OutputXML(Document docXML, String strFilename) {  
  27.     XMLOutputter fmt = new XMLOutputter();  
  28.     try {  
  29.       fmt.setEncoding("big5");  
  30.       fmt.setNewlines(true);  
  31.       FileWriter fwXML = new FileWriter(strFilename);  
  32.       fmt.output(docXML, fwXML);  
  33.       fwXML.close();  
  34.     }  
  35.     catch (IOException e) {  
  36.       e.printStackTrace();  
  37.     }  
  38.   }  
  39.   public static void main(String[] args) {  
  40.     myCreate myCreate1 = new myCreate();  
  41.   }  
  42. }  

讀進一份XML file :
目前XML最常被拿來應用的領域之一大概就是當作設定檔,因此,如何從檔案中讀入一份已存在的XML更為重要. JDOM是利用SAX或DOM來剖析XML,用SAX會比DOM效率好且速度快 (更多比較請參考 這理),所以一般都是用SAX,如果對SAX不熟悉,可以在 http://www.saxproject.org/ 找到相關文件資料.
範例2就是用SAX建立Document,在建立SAXBuilder時傳入的參數指出是否用DTD驗正XML的合法性,true表示要,false表示不要。當呼叫build之後JDOM就已經幫我們用SAX建立好一棵XML Tree,如此我們就可以很方便由Tree中找到我們要的節點.
===== 範例 2 =====
  1. import org.jdom.*;  
  2. import org.jdom.input.*;  
  3. import org.jdom.output.*;  
  4. import java.io.*;  
  5. import java.util.List;  
  6.   
  7. public class myRead {  
  8.   public myRead() {  
  9.     Document docJDOM;  
  10.     //利用SAX建立Document  
  11.     SAXBuilder bSAX = new SAXBuilder(false);  
  12.     try {  
  13.       docJDOM = bSAX.build(new File("e:/myJDOM.xml"));  
  14.     }  
  15.     catch (JDOMException e) {  
  16.       e.printStackTrace();  
  17.       return;  
  18.     }  
  19.   
  20.     //在根節點中加入一個新的子節點  
  21.     Element elmtRoot = docJDOM.getRootElement();  
  22.     Element elmtChapter = new Element("Chapter");  
  23.     elmtChapter.setText("驗正XML");  
  24.     elmtChapter.setAttribute("sort""4");  
  25.     elmtRoot.addContent(elmtChapter);  
  26.     //印出所有根節點的子節點  
  27.     List lstChildren = elmtRoot.getChildren("Chapter");  
  28.     for(int i=0; i
  29.       Element elmtChild = (Element) lstChildren.get(i);  
  30.       System.out.println("Child " + i);  
  31.       System.out.println("  Text:" + elmtChild.getText());  
  32.       System.out.println("  Attribute:" + elmtChild.getAttributeValue("sort"));  
  33.     }  
  34.   
  35.     //輸出到檔案  
  36.     OutputXML(docJDOM, "e:/myJDOM2.xml");  
  37.   }  
  38.   
  39.   private void OutputXML(Document docXML, String strFilename) {  
  40.     XMLOutputter fmt = new XMLOutputter();  
  41.     try {  
  42.       fmt.setEncoding("big5");  
  43.       fmt.setNewlines(true);  
  44.       FileWriter fwXML = new FileWriter(strFilename);  
  45.       fmt.output(docXML, fwXML);  
  46.       fwXML.close();  
  47.     }catch (IOException e) {  
  48.       e.printStackTrace();  
  49.     }  
  50.   }  
  51.   
  52.   public static void main(String[] args) {  
  53.     myRead myRead1 = new myRead();  
  54.   }  
  55. }  

轉換XML到HTML :
要將XML轉成HTML當然要先寫好XSL,但是即使寫好XSL,JDOM也並不提供XML轉換,幸好在JDOM安裝好之後,就會有Apache的Xalan,它可以幫我們做這樣的轉換. 要使用Apache 的 Xalan,首先確定 xalan.jar 在classpath裡。Xalan的第一個用法是在命令列執行,指令如下 :
C:\> java org.apache.xalan.xslt.Process –IN XML文件 –XSL XSL樣版 –OUT 輸出檔名

命令列的用法在一般的運用裡是很方便,但是我們有興趣的是在程式裡怎麼用。範例4提供了一個簡單的sample :
===== 範例 4 =====
  1. import javax.xml.transform.TransformerFactory;  
  2. import javax.xml.transform.Transformer;  
  3. import javax.xml.transform.TransformerException;  
  4. import javax.xml.transform.TransformerConfigurationException;  
  5. import javax.xml.transform.stream.*;  
  6.   
  7. public class myGenHTML {  
  8.   public myGenHTML(String strXML, String strXSL, String strHTML) {  
  9.     try {  
  10.       GenHTML(strXML, strXSL, strHTML);  
  11.     }catch (TransformerConfigurationException e) {  
  12.       e.printStackTrace();  
  13.     }catch (TransformerException e) {  
  14.       e.printStackTrace();  
  15.     }  
  16.   }  
  17.   private void GenHTML(String strXMLFile, String strXSLFile, String strHTMLFile) throws TransformerConfigurationException, TransformerException{  
  18.     TransformerFactory myFactory = TransformerFactory.newInstance();  
  19.     Transformer myTransformer = myFactory.newTransformer(new StreamSource(strXSLFile));  
  20.     myTransformer.transform(new StreamSource(strXMLFile), new StreamResult(strHTMLFile));  
  21.   }  
  22.   public static void main(String[] args) {  
  23.     myGenHTML myGenHTML1 = new myGenHTML(args[0], args[1], args[2]);  
  24.   }  
  25. }  

補充說明 :
Java API for XML Code Samples
Java API for XML processing (JAXP) lets you access XML documents either serially (SAX) or in random access mode (DOM).
DOM Examples
SAX Examples
XML Style Sheet language (XSLT) Examples
This message was edited 8 times. Last update was at 26/08/2011 16:33:32

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...