最直接的方法可以直接針對 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());
}
沒有留言:
張貼留言