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í)

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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          收藏夾

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

          綜合

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 石阡县| 稻城县| 聂荣县| 红桥区| 抚州市| 北碚区| 阿荣旗| 许昌市| 长垣县| 康马县| 武清区| 天津市| 大厂| 平安县| 榆社县| 葵青区| 阳西县| 龙南县| 庐江县| 岫岩| 钦州市| 永年县| 陆川县| 中西区| 浦东新区| 理塘县| 阿克苏市| 南平市| 凤凰县| 黔东| 土默特左旗| 甘南县| 乐安县| 应城市| 江门市| 普格县| 黄冈市| 菏泽市| 乌兰浩特市| 巍山| 镇雄县|