JDOM(ZT)

JDOM

(史帝芬, idealist@gcn.net.tw, 2002/4/1)

 

1.         Abstract

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

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

 

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

範例1展示如何建立、新增、刪除及輸出一份XML,每份XMLJDOM裡是由一個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是利用SAXDOM來剖析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.         轉換XMLHTML

要將XML轉成HTML當然要先寫好XSL,但是即使寫好XSLJDOM也並不提供XML轉換,幸好在JDOM安裝好之後,就會有ApacheXalan,它可以幫我們做這樣的轉換。

要使用ApacheXalan,首先確定xalan.jarclasspath裡。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]);

  }

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值