JDOM
1.????????
Abstract
在 Java 的世界裡,要操控 XML ,最簡(jiǎn)單的方法莫過(guò)於使用 JDOM 。在這裡我簡(jiǎn)單的介紹如何用 JDOM 從無(wú)到有的建立一分 XML 、當(dāng)有一份 XML file 時(shí),如何將這個(gè) XML file 讀進(jìn)程式裡及如何利用 JDOM 將 XML 透過(guò) XSLT 轉(zhuǎn)成 HTML 。
JDOM 是由 Brett Mclaughlin 和 Jason Hunter 編寫,在 http://www.jdom.org 可免費(fèi)下載。
2.????????
建立、新增、刪除、輸出
範(fàn)例 1 展示如何建立、新增、刪除及輸出一份 XML ,每份 XML 在 JDOM 裡是由一個(gè) Document 類別代表,所以一開始我們要先 new 一個(gè) Document ,在建構(gòu) Document 時(shí)應(yīng)指明根節(jié)點(diǎn),如果沒有指明,在建構(gòu)應(yīng)由 setRootElement 設(shè)定。基本上 XML 都可以化成一個(gè)樹狀結(jié)構(gòu),所以,在產(chǎn)生根節(jié)點(diǎn)之後,就由根節(jié)點(diǎn)開始增加子節(jié)點(diǎn),新增的方式是呼叫 Element.addContent 將新的節(jié)點(diǎn)加入。刪除如果知道是某節(jié)點(diǎn)以下的子節(jié)點(diǎn),則可呼叫 Element.getChildren 取得所有子節(jié)點(diǎn),再找出要?jiǎng)h除的點(diǎn)節(jié)予以刪除。
當(dāng)建立好 XML 之後,通常我們會(huì)希望將它輸出到檔案, JDOM 提供了 XMLOutputter 類別供我們輸出之用,輸出前要先設(shè)定編碼方式,不然,會(huì)以 UTF-8 為預(yù)設(shè)值, setNewlines 則是指明輸出時(shí)是否要幫我們斷行,方便閱讀,如果沒有加這行指令,預(yù)設(shè)是不會(huì)斷行,那麼所有資料將在同一行上。
===== 範(fàn)例 1 =====
import org.jdom.*;
import org.jdom.output.*;
import java.io.*;
import java.util.List;
public class myCreate {
? public myCreate() {
??? String[] strChapter = { "XML 簡(jiǎn)論 ", " 編寫 XML", " 剖析 XML", " 約制 XML", " 驗(yàn)正 XML", " 轉(zhuǎn)換 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.????????
讀進(jìn)一份
XML file
目前 XML 最常被拿來(lái)應(yīng)用的領(lǐng)域之一大概就是當(dāng)作設(shè)定檔,因此,如何從檔案中讀入一份已存在的 XML 更為重要。
JDOM 是利用 SAX 或 DOM 來(lái)剖析 XML ,用 SAX 會(huì)比 DOM ,所以一般都是用 SAX ,如果對(duì) SAX 不熟悉,在 http://www.saxproject.org/ 相關(guān)文件資料。
範(fàn)例 2 就是用 SAX 建立 Document ,在建立 SAXBuilder 時(shí)傳入的參數(shù)指出是否用 DTD 驗(yàn)正 XML 的合法性, true 表示要, false 表示不要。當(dāng)呼叫 build 之後 JDOM 就已經(jīng)幫我們用 SAX 建立好一棵 XML Tree ,如此我們就可以很方便由 Tree 中找到我們要的節(jié)點(diǎn)。
===== 範(fàn)例 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;
??? }
??? // 在根節(jié)點(diǎn)中加入一個(gè)新的子節(jié)點(diǎn)
??? Element elmtRoot = docJDOM.getRootElement();
??? Element elmtChapter = new Element("Chapter");
??? elmtChapter.setText(" 驗(yàn)正 XML");
??? elmtChapter.setAttribute("sort", "4");
??? elmtRoot.addContent(elmtChapter);
??? // 印出所有根節(jié)點(diǎn)的子節(jié)點(diǎn)
??? 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.????????
轉(zhuǎn)換
XML
到
HTML
要將 XML 轉(zhuǎn)成 HTML 當(dāng)然要先寫好 XSL ,但是即使寫好 XSL , JDOM 也並不提供 XML 轉(zhuǎn)換,幸好在 JDOM 安裝好之後,就會(huì)有 Apache 的 Xalan ,它可以幫我們做這樣的轉(zhuǎn)換。
要使用 Apache 的 Xalan ,首先確定 xalan.jar 在 classpath 裡。 Xalan 的第一個(gè)用法是在命令列執(zhí)行,指令如下…
C:\> java org.apache.xalan.xslt.Process –IN XML 文件 –XSL XSL 樣版 –OUT 輸出檔名
命令列的用法在一般的運(yùn)用裡是很方便,但是我們有興趣的是在程式裡怎麼用。範(fàn)例 4 提供了一個(gè)簡(jiǎn)單的 sample 。
===== 範(fàn)例 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]);
? }
}
posted on 2006-08-24 12:50 software5168 閱讀(699) 評(píng)論(0) 編輯 收藏 所屬分類: Java學(xué)習(xí)