1.         
						
				
				
						Abstract
				
		
		
				在
				Java
				的世界裡,要操控
				XML
				,最簡單的方法莫過於使用
				JDOM
				。在這裡我簡單的介紹如何用
				JDOM
				從無到有的建立一分
				XML
				、當有一份
				XML file
				時,如何將這個
				XML file
				讀進程式裡及如何利用
				JDOM
				將
				XML
				透過
				XSLT
				轉成
				HTML
				。
		
		
				JDOM
				是由
				Brett Mclaughlin
				和
				Jason Hunter
				編寫,在
				
						http://www.jdom.org
				
				可免費下載。
		
		
				
						 
				
		
		
				
						
								2.         
						
				
				
						建立、新增、刪除、輸出
				
				
						
								
								
						
				
		
		
				範例
				1
				展示如何建立、新增、刪除及輸出一份
				XML
				,每份
				XML
				在
				JDOM
				裡是由一個
				Document
				類別代表,所以一開始我們要先
				new
				一個
				Document
				,在建構
				Document
				時應指明根節點,如果沒有指明,在建構應由
				setRootElement
				設定。基本上
				XML
				都可以化成一個樹狀結構,所以,在產生根節點之後,就由根節點開始增加子節點,新增的方式是呼叫
				Element.addContent
				將新的節點加入。刪除如果知道是某節點以下的子節點,則可呼叫
				Element.getChildren
				取得所有子節點,再找出要刪除的點節予以刪除。
		
		
				當建立好
				XML
				之後,通常我們會希望將它輸出到檔案,
				JDOM
				提供了
				XMLOutputter
				類別供我們輸出之用,輸出前要先設定編碼方式,不然,會以
				UTF-8
				為預設值,
				setNewlines
				則是指明輸出時是否要幫我們斷行,方便閱讀,如果沒有加這行指令,預設是不會斷行,那麼所有資料將在同一行上。
		
		
				===== 
				範例
				 1 =====
		
		
				import org.jdom.*;
		
		
				import org.jdom.output.*;
		
		
				import java.io.*;
		
		
				import java.util.List;
		
		
				
						 
				
		
		
				public class myCreate {
		
		
				
						  public myCreate() {
		
		
				
						    String[] strChapter = { "XML
				簡論
				", "
				編寫
				XML", "
				剖析
				XML", "
				約制
				XML", "
				驗正
				XML", "
				轉換
				XML" };
		
		
				
						 
				
		
		
				
						    Element elmtRoot = new Element("Article");
		
		
				
						    Document docJDOM = new Document(elmtRoot);
		
		
				
						    //
				新增
		
		
				
						    for(int i=0; i<6; i++) {
		
		
				
						      Element elmtChapter = new Element("Chapter");
		
		
				
						      elmtChapter.addContent(strChapter[i]);
		
		
				
						      elmtChapter.setAttribute("sort", new Integer(i).toString());
		
		
				
						     
						 elmtRoot.addContent(elmtChapter);
		
		
				
						    }
		
		
				
						    //
				刪除
		
		
				
						    List lstChapter = elmtRoot.getChildren("Chapter");
		
		
				
						    lstChapter.remove(4);
		
		
				
						    //
				輸出
		
		
				
						    OutputXML(docJDOM, "e:/myJDOM.xml");
		
		
				
						  }
		
		
				
						 
				
		
		
				
						  private void OutputXML(Document docXML, String strFilename) {
		
		
				
						    XMLOutputter fmt = new XMLOutputter();
		
		
				
						    try {
		
		
				
						      fmt.setEncoding("big5");
		
		
				
						      fmt.setNewlines(true);
		
		
				
						      FileWriter fwXML = new FileWriter(strFilename);
		
		
				
						      fmt.output(docXML, fwXML);
		
		
				
						      fwXML.close();
		
		
				
						    }
		
		
				
						    catch (IOException e) {
		
		
				
						     
						 e.printStackTrace();
		
		
				
						    }
		
		
				
						  }
		
		
				
						 
				
		
		
				
						  public static void main(String[] args) {
		
		
				
						    myCreate myCreate1 = new myCreate();
		
		
				
						  }
		
		
				}
		
		
				
						 
				
		
		
				
						
								3.         
						
				
				
						讀進一份
				
				
						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 =====
		
		
				import org.jdom.*;
		
		
				import org.jdom.input.*;
		
		
				import org.jdom.output.*;
		
		
				import java.io.*;
		
		
				import java.util.List;
		
		
				
						 
				
		
		
				public class myRead {
		
		
				
						  public myRead() {
		
		
				
						    Document docJDOM;
		
		
				
						 
				
		
		
				
						    //
				利用
				SAX
				建立
				Document
		
		
				
						    SAXBuilder bSAX = new SAXBuilder(false);
		
		
				
						    try {
		
		
				
						      docJDOM = bSAX.build(new File("e:/myJDOM.xml"));
		
		
				
						    }
		
		
				
						    catch (JDOMException e) {
		
		
				
						      e.printStackTrace();
		
		
				
						      return;
		
		
				
						    }
		
		
				
						    //
				在根節點中加入一個新的子節點
		
		
				
						    Element elmtRoot = docJDOM.getRootElement();
		
		
				
						    Element elmtChapter = new Element("Chapter");
		
		
				
						    elmtChapter.setText("
				驗正
				XML");
		
		
				
						    elmtChapter.setAttribute("sort", "4");
		
		
				
						    elmtRoot.addContent(elmtChapter);
		
		
				
						    //
				印出所有根節點的子節點
		
		
				
						    List lstChildren = elmtRoot.getChildren("Chapter");
		
		
				
						    for(int i=0; i<lstChildren.size(); i++) {
		
		
				
						      Element elmtChild = (Element) lstChildren.get(i);
		
		
				
						      System.out.println("Child " + i);
		
		
				
						      System.out.println("  Text:" + elmtChild.getText());
		
		
				
						      System.out.println("  Attribute:" + elmtChild.getAttributeValue("sort"));
		
		
				
						    }
		
		
				
						    //
				輸出到檔案
		
		
				
						    OutputXML(docJDOM, "e:/myJDOM2.xml");
		
		
				
						  }
		
		
				
						 
				
		
		
				
						  private void OutputXML(Document docXML, String strFilename) {
		
		
				
						    XMLOutputter fmt = new XMLOutputter();
		
		
				
						    try {
		
		
				
						      fmt.setEncoding("big5");
		
		
				
						      fmt.setNewlines(true);
		
		
				
						      FileWriter fwXML = new FileWriter(strFilename);
		
		
				
						      fmt.output(docXML, fwXML);
		
		
				
						      fwXML.close();
		
		
				
						    }
		
		
				
						    catch (IOException e) {
		
		
				
						      e.printStackTrace();
		
		
				
						    }
		
		
				
						  }
		
		
				
						 
				
		
		
				
						  public static void main(String[] args) {
		
		
				
						    myRead myRead1 = new myRead();
		
		
				
						  }
		
		
				}
		
		
				
						 
				
		
		
				
						
								4.         
						
				
				
						轉換
				
				
						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 =====
		
		
				import javax.xml.transform.TransformerFactory;
		
		
				import javax.xml.transform.Transformer;
		
		
				import javax.xml.transform.TransformerException;
		
		
				import javax.xml.transform.TransformerConfigurationException;
		
		
				import javax.xml.transform.stream.*;
		
		
				
						 
				
		
		
				public class myGenHTML {
		
		
				
						 
				
		
		
				
						  public myGenHTML(String strXML, String strXSL, String strHTML) {
		
		
				
						    try {
		
		
				
						      GenHTML(strXML, strXSL, strHTML);
		
		
				
						    }
		
		
				
						    catch (TransformerConfigurationException e) {
		
		
				
						      e.printStackTrace();
		
		
				
						    }
		
		
				
						    catch (TransformerException e) {
		
		
				
						      e.printStackTrace();
		
		
				
						    }
		
		
				
						  }
		
		
				
						 
				
		
		
				
						  private void GenHTML(String strXMLFile, String strXSLFile, String strHTMLFile) throws TransformerConfigurationException, TransformerException
		
		
				
						  {
		
		
				
						    TransformerFactory myFactory = TransformerFactory.newInstance();
		
		
				
						    Transformer myTransformer = myFactory.newTransformer(new StreamSource(strXSLFile));
		
		
				
						    myTransformer.transform(new StreamSource(strXMLFile), new StreamResult(strHTMLFile));
		
		
				
						  }
		
		
				
						 
				
		
		
				
						  public static void main(String[] args) {
		
		
				
						    myGenHTML myGenHTML1 = new myGenHTML(args[0], args[1], args[2]);
		
		
				
						  }
		
		
				}