2011年2月6日 星期日

【Java XML】JDOM 介紹

再 JAVA 的開發環境裏如果要生成 XML 檔或是針對 XML 檔作分析時

最直接的方法可以直接針對 XML 的格式輸出或是轉成 String 型態來擷取想要的資訊

但往往這樣做複雜且也容易出錯,因此可以使用 JDOM 來解析 XML

首先先到 http://www.jdom.org 下載 JDOM 的類別庫,目前最新版為 1.1.1

下載完並解壓縮後在 jdom 目錄下的 build 會有一個 jdom.jar,將它加到你的路徑中

就可以用 JDOM 來開發 XML 了,以下先介紹 JDOM 是如何解析 XML 的

org.jdom.input.SAXBuilder 類別:
當要讀取 XML 時,要使用 org.jdom.input 下的 SAXBuilder 搭配輸入串流來建構 XML 檔


org.jdom.Document 類別:
代表了你這份 XML 的物件



org.jdom.Element 類別:
代表了 XML 裡面的所有標籤,也就是每個標籤在 JDOM 裡就是以 Element 表示


org.jdom.Comment 類別:
此為 XML 中的注解

通常在擷取 XML 中的資料時會先取得代表該檔案的 Document 物件

並運用 Document getRootElement() 來取得根標籤(root) 的 Element 物件

取得 root 之後就可以使用 Element 的 getChild(/*標籤名稱*/) 或是 getChildren() 取得子標籤


至於如何取得 Document,這就必須透過 SAXBuilder build(/*輸入串流*/) 方法來取得

故以下以一個例子先建立一個 XML 檔,以下為一個 Java WEB 的環境

package com.contoller;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import javax.servlet.http.HttpServletRequest;
public class FileOperator 
{
    public String createMessageStoreFile(HttpServletRequest req)
    {
        java.util.Date d = new java.util.Date();
        String formatTime = new SimpleDateFormat("yyyyMMdd").format(d);
        String path = req.getRealPath("XML/" + formatTime + ".xml"); //取得該XML黨在 Server 下的路徑
        File f = new File(path);
        if(!f.exists()){  //不存在即建立
            try{
                f.createNewFile();
                FileOutputStream fos = new FileOutputStream(f);
                String xmlContent = "<?xml version=\"1.0\" encoding=\"GBK\"?>\r\n";
                xmlContent = xmlContent + "\r\n";
                xmlContent = xmlContent + "";
                xmlContent = xmlContent + "";
                xmlContent = xmlContent + "\r\n";
                byte[] byte_content = xmlContent.getBytes();
                fos.write(byte_content);
                fos.close();
            }catch(IOException e){
                 System.out.println(e.getMessage());
            }
        }
        return path;  //回傳路徑
    }
}


所以呼叫該函式可以建構一個 XML 檔,並回傳該檔案的路徑,接下來介紹如何加入或建構標籤到 XML 檔中
String Xml_path = new FileOperator().createMessageStoreFile(request);  //建立檔案並回傳路徑
    SAXBuilder sax_builder = new SAXBuilder();   //SAXBuilder
    try{
        Document document = sax_builder.build(Xml_path);   //取得 Document 物件
        Element root = document.getRootElement();   //取得 root 節點
        Element messages = root.getChild("messages");   //取得 messages 節點

        Element message = new Element("message");  //建立一個新標籤 message
        Element from = new Element("from");   //建立一個新標籤 from 
        from.setText("[系統公告]");   //設定 from 標籤的值
        Element to = new Element("to");   //建立一個新標籤 to
        to.setText("");   /設定 to 標籤的值
        Element content = new Element("content");   //建立一個新標籤 content
        content.setText(username);   //設定 content 標籤的值

        //append node
        messages.addContent(message);  //messages 標籤中新增一個子標籤 message
        message.addContent(from);  //message 標籤中新增一個子標籤 from
        message.addContent(to);  //message 標籤中新增一個子標籤 to
        message.addContent(content);  //message 標籤中新增一個子標籤 content
        
        //output
        XMLOutputter xml_output = new XMLOutputter(Format.getPrettyFormat());
        xml_output.output(document, new FileOutputStream(Xml_path));
    }catch(JDOMException e){
        System.out.println(e.getMessage());    
    }

至於要如何抓取 XML 中標籤值的話,如以下
SAXBuilder sax_builder = new SAXBuilder();
Document document;
try{
    document = sax_builder.build(Xml_path);
    Element root = document.getRootElement();   //取得 root 節點
    Element messages = root.getChild("messages");   //取得 messages 節點
    Iterator iterator = messages.getChildren("message").iterator(); //取得messages 下的所有 message 的節點
    while(iterator.hasNext()){
        Element message = (Element)iterator.next();  //取出 message Element
        String from = message.getChildText("from");   //取出 message 標籤下的 from 標籤的值
        String to = message.getChildText("to");   //取出 message 標籤下的 from 標籤的值
        String content = message.getChildText("content");    //取出 message 標籤下的 from 標籤的值
        
        /**** Do something here ****/
    }

}catch(JDOMException e){
    System.out.println(e.getMessage());    
}

沒有留言:

張貼留言