本 期 焦 點
  • 小編碎碎念
  • 狂賀!!藍色小舖入圍『數位內容產品獎』決賽
  • 如何掌握關心的討論主題?
  • XML設定檔之應用
  • fong作業管理系統V2.0
    當 月 下 載 排 行 榜
  • 怡情多用戶留言板V3.0(繁體版)
  • fong作業管理系統V2.0
  • 優秀的下載系統MX_flash留言板
  • NowaNS_12YES.com美化版整站系統
  • 裝可愛留言版-修正更新9/2
    討 論 區 精 華
  • ASP.NET產生EXCEL文件
  • [NET]將報表輸出成PDF檔,讓使用者來列印報表
  • 資料分離的方法
  • [NET]轉存成Word 檔
  • 線上人數
    優 值 廣 告


    ■ 訂 閱 電 子 報
  • 如何取消訂閱電子報
  • 如果您不願意再收到小舖電子報,請至小舖先登入會員後,再選擇會員專區中的修改個人資料,將(是否願意接受本站電子報?)這一項修改為(不願意)即可,本報如造成您的困擾,小舖在此對您致上十二萬分的歉意。
    -----頭版新聞-----
    藍色小舖電子報(第018期 2003-9-25)48000份
    ◎小編碎碎念

    親愛的 XXX,您好:
    前天接到2003數位內容產品獎入圍通知,真是振奮小舖經營團隊的一個好消息,努力發展藍色小舖的使命更加鮮明嚕! 嘻嘻...相信大家也為小舖高興吧!
    從2002年10月改版至今,即將屆滿一年了,真的要感謝大家對小舖的持續支持與愛護,未來小舖會有更多活動與服務推出,大家一定要共襄盛舉喔!!!

    ◎狂賀!!藍色小舖入圍『2003數位內容產品獎』決賽

    狂賀!!
    賀喜藍色小舖入圍2003年『數位內容產品獎』甄選-創新軟體組決賽入圍名單

    指導單位:經濟部工業局
    主辦單位:網路多媒體產業發展推動計畫、數位內容產業推動辦公室
    執行單位:中華網路多媒體協會、台灣大學計算機及資訊網路中心
    協辦單位:中華民國資訊學會

    參賽說明網址
    http://www.iicm.org.tw/activity/20030320dcp/

    入圍名單
    http://wwwiicm.org.tw/activity/20030320dcp/first.htm

    如何掌握關心的討論主題?

    你會不會覺得有些討論主題內容很好,但是當想要找的時候,卻消失在茫茫的討論主題中?
    你會不會要找曾經發表或是參與討論的文章,也常常找不到
    小舖有特別為加值會員設計了【我的關注話題】【個人討論群】的功能
    以後只要看到喜歡的文章,將他加入到【我的關注話題】,就不怕它消失在網海中。
    而只要點選【個人討論群】,就可以看到曾經參與過的討論,也不用再辛辛苦苦的去尋找
    可以節省寶貴的時間,來學習更多的事物
    快來試試這些功能吧...

    [相關鏈結]

    ----精選討論區精華----
     
    ◎XML設定檔之應用 ( 2003/9/14)

    XML在分散式架構中的優點可以說是如滔滔江水般說不清楚,而缺點跟他的優點是一致的,當我們在運用各種自訂協定時,我們都需要去定義一堆的DTD和Schema,過程很煩瑣或者說~開的會太多.....=.=",每當大家正在擁抱SOAP惡夢時,都會想~為什麼這個世界出現XML這種東西,唉....

    所以呢,我們總是要發現他的優點,就像有女生來倒貼時,總是要給他一些機會一樣,這樣才能發現她的體貼和溫柔(糟,偏題了),接著,我想就把他拿來做一些示範性的應用,讓大家可以發現他更大的好處和想法,我將利用XPath和DOM來做為解析XML的工具,你可以去下載xerces.jar和xalan.jar到http://xml.apache.org/此網站下載

    在一開始,我將Properties和XML做一個功能面的分析,因為XML待會要做的事情和Properties是一致的,這將會是一個爭議點,有些人或許會問,為何不直接用Properties做設定檔就好,好,既然有人有這種問題,那來自外星球的我自然要有一個Q&A來解決地球人這些有可能會有的質疑
    Q:為何不直接用Properties做設定檔就好?
    A:這是一個很好的考慮點,Properties較適合拿來應用在已固定而且不會時常修改的地方,像JMS的channel,queue manager..等等設定、語系設定或者是任何在系統初始化時被認定為常數而且有其"重要性"與"可更改性"之值,較適合拿來做系統設定檔,而XML他除了具有以上優點之外,另外還可以分出訊息群組和較易看懂的人性化標籤,在擴充性上是很好的,但在文件定義上是很麻煩的,而且還要另外寫解析器

    Q:既然那麼麻煩,那你幹嘛還要貼這篇文章?
    A:這個問題就很差,若將他改成,既然那麼麻煩,幹嘛不寫一次就好,因為寫好的解析器是一個重用性極高的元件,而XML文件就像我們在寫公文,打英文報告一樣,有一個範本在,只是修修改改而已,寫程式的人就是因為懶,才需要坐在椅子上按Ctrl+c和Ctrl+v來工作,而且還有冷氣吹~所以去賣雞排的都有很嚴重的心理問題,他們沒有曬到太陽會很不高興,再加上天生對雞就有成見,所以去賣雞排,大家千萬不要學他們

    其他我想不到了,你們可以問,我可以答喔!!,接著要開始辦正事了,首先我們會很需要一個XML來當範例(廢話)
    <?xml version="1.0" encoding="big5"?>
    <messages>
    <errors>
    <record-not-found>找不到此筆記錄</record-not-found>
    <db-error>資料庫連結錯誤</db-error>
    <input-error>資料輸入不齊全</input-error>
    </errors>

    <informations>
    <logout-successful>您已成功登出</logout-successful>
    </informations>
    </messages>
    這就是示範用的XML文件,他看起來就很棒的樣子,有沒有看到丫~~接著,我們需要一個解析器
    package idv.etman.xml;

    import java.io.File;
    import java.io.FileReader;
    import java.io.BufferedReader;
    import java.io.Reader;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.HashMap;

    import javax.xml.transform.TransformerException;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;

    import org.w3c.dom.Document;
    import org.w3c.dom.NodeList;
    import org.w3c.dom.Node;
    import org.w3c.dom.Element;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    import org.apache.xpath.XPathAPI;

    /**
    * @author etman
    * @version 1.0
    */

    public class XMLMessageFactory {
    private static XMLMessageFactory msg = new XMLMessageFactory();
    private HashMap messages = null;
    /**
    * 此類別建構子是不能被存取的,確保其於VM中的實例單一性和外部類別合作之安全
    */

    private XMLMessageFactory() {
    messages = new HashMap();
    }

    /**
    * 繫結XML文件,傳入XML文件檔之路俓,傳回XMLMessages,接著可以開始操作此份XML文件
    * @param configFilePath
    * @return
    * @throws FileNotFoundException
    * @throws IOException
    * @throws ParserConfigurationException
    * @throws SAXException
    */

    public static XMLMessages bundle(String configFilePath) throws
    FileNotFoundException,
    IOException,
    ParserConfigurationException,
    SAXException {
    return bundle(new File(configFilePath));
    }

    /**
    * 繫結XML文件,傳入XML文件檔,傳回XMLMessages,接著可以開始操作此份XML文件
    * @param configFilePath
    * @return
    * @throws FileNotFoundException
    * @throws IOException
    * @throws ParserConfigurationException
    * @throws SAXException
    */

    public static XMLMessages bundle(File configFile) throws
    FileNotFoundException,
    IOException,
    ParserConfigurationException,
    SAXException {
    XMLMessages msgobj = msg.bundled(configFile.getPath());
    if (msgobj != null) {
    return msgobj;
    }
    if (!configFile.exists()) {
    throw new FileNotFoundException(configFile.getPath());
    }
    BufferedReader reader = null;
    try {
    reader = new BufferedReader(new FileReader(configFile));
    msgobj = bundle(reader);
    }
    finally {
    if (reader != null) {
    reader.close();
    }
    }
    msg.keepInstance(configFile.getPath(), msgobj);
    return msgobj;
    }

    /**
    * 取得XMLMessages,key為此設定檔之路俓
    * @param key
    * @return
    */

    protected XMLMessages bundled(String key) {
    return (XMLMessages) messages.get(key);
    }

    /**
    * 將解析完的XML放置在pool中,下次拿取時,就不用再解一次,這樣就快多囉
    * @param key
    * @param msgobj
    */

    protected void keepInstance(String key, XMLMessages msgobj) {
    messages.put(key, msgobj);
    }

    /**
    * 傳入Reader讓DocumentBuilder去解析成Document物件
    * @param key
    * @param msgobj
    */

    protected final static XMLMessages bundle(Reader xmlReader) throws
    IOException,
    ParserConfigurationException, SAXException {
    DocumentBuilder builder = DocumentBuilderFactory.newInstance().
    newDocumentBuilder();
    return new XMLMessages(builder.parse(new InputSource(xmlReader)));
    }

    }

    然後,我們還需要一個操作XML的類別,他就是XMLMessages
    package idv.etman.xml;

    import javax.xml.transform.TransformerException;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;

    import org.w3c.dom.Document;
    import org.w3c.dom.NodeList;
    import org.w3c.dom.Node;
    import org.w3c.dom.Element;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    import org.apache.xpath.XPathAPI;

    /**
    * @author etman
    * @version 1.0
    */

    public class XMLMessages {
    final Document xmldoc;
    protected XMLMessages(Document doc) {
    xmldoc = doc;
    }

    /**
    * 取得值,傳入值位於XML標籤的哪個路俓
    * PS:若有相同的標籤名稱,取最後一個,若找不到,傳回u
    * @param xPath
    * @return
    */

    public String getValue(String xPath) {
    String text = null;
    try {
    NodeList list = findNodeListFromRoot(xPath);
    Element element = (Element) list.item(list.getLength() - 1);
    Node node = element.getFirstChild();
    switch (node.getNodeType()) {
    case Node.TEXT_NODE:
    case Node.CDATA_SECTION_NODE:
    text = node.getNodeValue();
    break;
    }
    }
    catch (SAXException e) {}
    return text;
    }

    /**
    * 傳回此標籤的列表,傳入標籤位於XML何處
    * @param xPath
    * @return
    * @throws SAXException
    */

    public NodeList findNodeListFromRoot(String xPath) throws SAXException {
    Element rootElement = xmldoc.getDocumentElement();
    return findMapping(rootElement, xPath);
    }

    /**
    * 這裡的第一個參數是要從XML的哪個標籤開始尋找,第二個參數為標籤路俓
    * @param element
    * @param xpath
    * @return
    * @throws SAXException
    */

    private final static NodeList findMapping(Element element, String xpath) throws
    SAXException {
    try {
    return XPathAPI.selectNodeList(element, xpath);
    }
    catch (TransformerException ex) {
    throw new SAXException(ex.getMessage(), ex);
    }
    }

    }
    接著,我們該如何使用他們呢??~
    import idv.etman.xml.XMLMessageFactory;
    import idv.etman.xml.XMLMessages;

    public class XMLMessageTest {
    public XMLMessageTest() {
    }

    public static void main(String[] args) {
    try{
    XMLMessages msg = XMLMessageFactory.bundle(
    "C:\\Documents and Settings\\Administrator\\桌面\\新增文字文件.xml");
    System.out.println(msg.getValue("/messages/errors/db-error"));
    System.out.println(msg.getValue("/messages/informations/logout-successful"));
    }
    catch(Exception e){
    e.printStackTrace();
    }
    }
    }
    你應該會有另一個疑問,如果要抓一個值要打那麼長的字串,到底有沒有合乎快速開發的精神,我的回答是這是當然,但要負責這些的類別重用性不高,所以我認為就由你們去包他吧,把這些path包起來就可以運用了,固定的都是在群組的標籤,這我想你們會有辦法去包起來的,而這兩個類別也不只能運用在設定檔上,我想這應該能理解^_^~~

     

    --------------------------------------------------------------------------------

    提供者: etman ( etman@pchome.com.tw )

    [校稿:藍色小舖 ]

    ----新進程式介紹----
     
    ◎fong作業管理系統V2.0 (2003/9/15)

    感謝會員fong提供fong作業管理系統V2.0

    功能說明

    管理端
    1.新增,刪除,修改作業設定
    2.使用者管理
    3.使用者註冊設定
    4.未繳作業記錄
    5.資料庫備分
    6.匯出學生作業
    7.封存作業
    8.設定觀摩班級
    9.評分
    10.年級升級
    -----------------------
    使用者端
    1.未繳作業
    2.已繳作業
    3.更改密碼
    4.紀錄查詢
    5.觀摩作業

    藍色小舖電子報內容 由 藍色小舖 提供
    [藍色小舖發行]--版權所有, 歡迎完整轉寄
     
    |
    |
    |
    |
    |
    若需任何服務
    請洽客服信箱:
    webmaster@blueshop.com.tw