JDOM

          1.???????? Abstract

          Java 的世界裡,要操控 XML ,最簡單的方法莫過於使用 JDOM 。在這裡我簡單的介紹如何用 JDOM 從無到有的建立一分 XML 、當(dāng)有一份 XML file 時,如何將這個 XML file 讀進(jìn)程式裡及如何利用 JDOM XML 透過 XSLT 轉(zhuǎn)成 HTML 。

          JDOM 是由 Brett Mclaughlin Jason Hunter 編寫,在 http://www.jdom.org 可免費下載。

          ?

          2.???????? 建立、新增、刪除、輸出

          範(fàn)例 1 展示如何建立、新增、刪除及輸出一份 XML ,每份 XML JDOM 裡是由一個 Document 類別代表,所以一開始我們要先 new 一個 Document ,在建構(gòu) Document 時應(yīng)指明根節(jié)點,如果沒有指明,在建構(gòu)應(yīng)由 setRootElement 設(shè)定?;旧?/span> XML 都可以化成一個樹狀結(jié)構(gòu),所以,在產(chǎn)生根節(jié)點之後,就由根節(jié)點開始增加子節(jié)點,新增的方式是呼叫 Element.addContent 將新的節(jié)點加入。刪除如果知道是某節(jié)點以下的子節(jié)點,則可呼叫 Element.getChildren 取得所有子節(jié)點,再找出要刪除的點節(jié)予以刪除。

          當(dāng)建立好 XML 之後,通常我們會希望將它輸出到檔案, JDOM 提供了 XMLOutputter 類別供我們輸出之用,輸出前要先設(shè)定編碼方式,不然,會以 UTF-8 為預(yù)設(shè)值, setNewlines 則是指明輸出時是否要幫我們斷行,方便閱讀,如果沒有加這行指令,預(yù)設(shè)是不會斷行,那麼所有資料將在同一行上。

          ===== 範(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 簡論 ", " 編寫 XML", " 剖析 XML", " 約制 XML", " 驗正 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 最常被拿來應(yīng)用的領(lǐng)域之一大概就是當(dāng)作設(shè)定檔,因此,如何從檔案中讀入一份已存在的 XML 更為重要。

          JDOM 是利用 SAX DOM 來剖析 XML ,用 SAX 會比 DOM ,所以一般都是用 SAX ,如果對 SAX 不熟悉,在 http://www.saxproject.org/ 相關(guān)文件資料。

          範(fàn)例 2 就是用 SAX 建立 Document ,在建立 SAXBuilder 時傳入的參數(shù)指出是否用 DTD 驗正 XML 的合法性, true 表示要, false 表示不要。當(dāng)呼叫 build 之後 JDOM 就已經(jīng)幫我們用 SAX 建立好一棵 XML Tree ,如此我們就可以很方便由 Tree 中找到我們要的節(jié)點。

          ?

          ===== 範(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é)點中加入一個新的子節(jié)點

          ??? Element elmtRoot = docJDOM.getRootElement();

          ??? Element elmtChapter = new Element("Chapter");

          ??? elmtChapter.setText(" 驗正 XML");

          ??? elmtChapter.setAttribute("sort", "4");

          ??? elmtRoot.addContent(elmtChapter);

          ??? // 印出所有根節(jié)點的子節(jié)點

          ??? 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 安裝好之後,就會有 Apache Xalan ,它可以幫我們做這樣的轉(zhuǎn)換。

          要使用 Apache Xalan ,首先確定 xalan.jar classpath 裡。 Xalan 的第一個用法是在命令列執(zhí)行,指令如下…

          C:\> java org.apache.xalan.xslt.Process –IN XML 文件 –XSL XSL 樣版 –OUT 輸出檔名

          命令列的用法在一般的運用裡是很方便,但是我們有興趣的是在程式裡怎麼用。範(fàn)例 4 提供了一個簡單的 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 閱讀(707) 評論(0)  編輯  收藏 所屬分類: Java學(xué)習(xí)

          <2006年8月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          收藏夾

          JAVA學(xué)習(xí)網(wǎng)站

          綜合

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 德令哈市| 金阳县| 韶关市| 孝感市| 白朗县| 永嘉县| 马龙县| 右玉县| 兴文县| 弥渡县| 阿拉尔市| 穆棱市| 通化市| 江陵县| 会昌县| 绥滨县| 辽中县| 临漳县| 荃湾区| 道真| 美姑县| 项城市| 乐平市| 安义县| 石嘴山市| 囊谦县| 宁海县| 合作市| 尉氏县| 嘉义市| 湘乡市| 辽宁省| 原阳县| 贺州市| 明星| 新乡市| 洪江市| 永寿县| 铁力市| 兴城市| 绍兴市|