JDOM

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]);

  }

}

posted on 2006-08-24 12:50 software5168 阅读(675) 评论(0)  编辑  收藏 所属分类: Java學習


只有注册用户登录后才能发表评论。


网站导航:
 
<2006年8月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

常用链接

留言簿(3)

随笔分类

随笔档案

收藏夹

JAVA學習網站

綜合

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜