最直接的方法可以直接針對 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 + " \r\n"; byte[] byte_content = xmlContent.getBytes(); fos.write(byte_content); fos.close(); }catch(IOException e){ System.out.println(e.getMessage()); } } return path; //回傳路徑 } }"; xmlContent = xmlContent + " "; xmlContent = xmlContent + "
所以呼叫該函式可以建構一個 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()); }
沒有留言:
張貼留言