• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    用JDom輕松整合Java和XML

    發布: 2007-6-08 17:47 | 作者: 網絡轉載 | 來源: 網絡 | 查看: 94次 | 進入軟件測試論壇討論

    領測軟件測試網 概述:

      Jdom是用Java語言讀、寫、操作XML的新API函數。Jason Hunter 和 Brett McLaughlin公開發布了它的測試版本。在直覺、簡單和高效的前提下,這些API函數被最大限度的優化。在接下來的篇幅里,Hunter 和 McLaughlin介紹怎么用Jdom去讀寫一個已經存在的XML文檔。
      Jdom是一個開源的api,它以直接易懂的方式向java程序員描述XML文檔和文檔的內容。就象名字揭示的那樣,Jdom是為java優化的。為使用XML文檔提供一個低消耗的方法。Jdom的使用者可以不必掌握太多的XML的知識就可以完成想要的操作。

      Jdom可以和已有的XML技術如Simple API for XML (SAX)和 Document Object Model (DOM)相互協作.然而,它并不是簡單的從這些api中提取出一些。Jdom從這些已存在的技術中吸收了好的方面,自己建立了一套新的類和接口,用一個Jdom用戶的話來說就是:“這些接口是我從一開始閱讀org.w3c.dom就期待的”;Jdom可以讀入SAX或是DOM的內容,也可以輸出SAX或DOM可以接收的格式。這個能力可以使Jdom很好的和已有的用SAX或DOM建立的系統之間整合。

      Jdom的原則

      第一條并且是最重要的一條就是Jdom的api函數被設計成對java程序員來說是簡單易懂的。其他的XML解析函數被設計成語言通用的(支持相同的api函數在java,c++,甚至是javascript中)。Jdom利用了java的優秀的特征,如:方法重載、回收機制,和后臺處理等。

      為了能夠簡單易用,這些函數不得不以程序員喜歡的形式來描繪XML文檔。例如:程序員想的到的一個元素的文本內容是什么樣子的呢?

    <element>This is my text content</element>

      在一些api中,元素的文本內容僅被當作是一個元素的孩子節點。從技術角度來說,這個設計需要下面的代碼才能訪問到元素的內容:

    String content = element.getFirstChild().getValue();

      Jdom用一種更簡單易用的方法來取得元素的內容:

    String text = element.getText();

      Jdom盡可能的減少程序員的工作量。依據拇指規則,Jdom應該用20%或是更少的努力來完成80%或是更多的java/xml方面的問題。這并不是說Jdom只是支持80%的XML規范(實際上我們希望Jdom100%的支持XML規范)。這個拇指規則是說有些東西可以加進去,但是沒有必要。這些api函數應該保持簡潔。

      Jdom的第二條原則是說Jdom應該是快速的和輕量級的。調入和執行文檔應該快速,內存的消耗應該盡量小。Jdom的設計明顯是遵循這個原則。例如,就算在開始的時候,不太協調的操作已經比DOM快,但是比SAX顯的粗糙。盡管這樣,Jdom還是有許多SAX沒有的優點。
      你需要Jdom嗎?

      那么,你需要Jdom嗎?這真是一個很好的問題。已經有了存在的標準,為什么還要去發明一個新的呢?答案是Jdom解決了現有的標準解決不了的問題。

      DOM完全在內存中描述一個元素樹。它是一個大的api,被設計操作幾乎所有可能的XML任務。它也必須有相同的api去支持不同的語言。因為這些限制,對那些習慣使用java的特征,如方法重載、簡單的set,get方法的java程序員來說,就很不習慣。DOM還需要大量的內存和較高的主頻,這使它很難和許多輕量級的web應用一起工作。

      SAX沒有在內存中建立一個元素樹,它用事情發展的方式來描述。例如:它報告每個讀到的開始標記和結束標記。這種處理方式使它成為一個輕量級的快速讀取的api。然而,這種事件處理方式對服務器端的java程序員來說不夠直觀。SAX也不支持修改XML文檔和隨機讀取。

      Jdom試圖組合DOM和SAX的優點。它被設計成一個可以在小內存上快速執行輕量級api 。Jdom也支持隨機讀取整個文檔,但是令人驚奇的是它并不需要把整個文檔讀到內存中。這個api支持未來的當需要時才讀入信息的次輕量級操作。還有,Jdom通過標準的構造器和set方法支持XML文檔的修改。

      獲取XML文檔

      Jdom用org.Jdom.Document類的一個實例來描述一個XML文檔。這個文檔類是一個輕重量級的,它可以包括文檔類型、多處理指令的對象、一個根元素和注釋對象。你可以不需要構造器而從草稿構造一個文檔。

    Document doc = new Document(new Element(rootElement));

      本文后面我們會討論從草稿構造一個XML文檔是多么的容易。但是現在,我們從一個已存在的文件、一個流、或是一個URL路徑中構造我們的文檔。

    SAXBuilder builder = new SAXBuilder();
    Document doc = builder.build(url);

      你可以用org.Jdom.input包中提供的構造類從任何數據源中構造文檔。最近,有兩種構造方式:SAXBuilder 和 DOMBuilder。SAXBuilder用sax解析器從文件中構造文檔。SAXBuilder偵聽sax事件并從內存中建立一個相應的文檔。這種方式非?欤ɑ旧虾蛃ax一樣快),這也是我們推薦的方式。DOMBuilder是另一種可選的方式,它從一個存在的org.w3c.dom.Document對象中建立Jdom文檔。它允許Jdom輕松的和構建DOM樹的工具實現接口。

      Jdom的速度有值得期待的提高的潛力通過一個延期的構造器的完成。這個構造器檢查XML數據源,但當請求的時候才對它解析。例如:文檔的屬性當不訪問時是不需要解析的。

      構造器仍在發展,可以通sql查詢、ldap查詢和其他的數據格式來夠造Jdom文檔。所以,一旦進到內存中,文檔就和建造它的工具沒有關系了。

      SAXBuilder 和 DOMBuilder構造器允許用戶指明他們是否應該輪換,以便確定哪個解析器時間執行解析的任務。

    public SAXBuilder(String parserClass, boolean validation);
    public DOMBuilder(String adapterClass, boolean validation);

      默認的是用apache的開源 Xerces解析器并且是關閉輪換的。你應該注到DOMBuilder不象一個解析類,倒更象一個適配類。這是因為不是所有的DOM解析器都是相同的api。為了仍讓用戶選擇喜歡的解析器,Jdom使用一個對所有的dom解析器適用的公共的api的適配類。這個適配類支持所有流行的dom解析器,包括Apache 的 Xerces, Crimson,IBM 的 XML4J, Sun 的 Project X, 和Oracle 的 parsers V1 and V2.每一個解析器通過正確的調用別的解析器的方法執行標準的接口。這有點象jaxp,除了它支持jaxp所不支持的新的解析器。
      輸出XML文檔

      你可以用幾種不同的標準輸出工具輸出一個XML文檔。org.Jdom.output.XMLOutputter也許是最常用方法。它將xml文檔寫入一個特定的OutputStream.

      SAXOutputter工具是另一個選擇。它產生基于Jdom xml文檔的sax事件,你可以把這些送到等待這些sax事件的應用程序那里。相同的方式,DOMOutputter產生一個dom文檔,這樣你就可以把它送給可以接收dom文檔的應用程序。輸出xml文檔的代碼看起來象下邊的樣子:

    XMLOutputter outputter = new XMLOutputter();
    outputter.output(doc, System.out);

      XMLOutputter用參數定制輸出的格式。第一個參數是行縮進的格式;第二個參數是你是否想另起一行。因為機器到機器的原因,為了速度考慮你可以放棄行縮進和另起新行。

    XMLOutputter outputter = new XMLOutputter(, false);
    outputter.output(doc, System.out);

     。ㄗg注:這樣的話自己看起來會很不好看,而且每一次重新寫入的時候都會使這個xml文件變大,所以我建議還是要縮進和另起一行,支持中文的帶換行和縮進的格式如下:

    XMLOutputter outp = new XMLOutputter(“”,true,GB2312);

    outp.setTextTrim(true);

    outp.output(doc, System.out);

      可以參見以前我寫的Jdom的文章http://www.csdn.net/Develop/read_article.asp?id=20720)

      下面是讀入一個xml文檔,并把它又輸出的例子:

    import java.io.*;
    import org.Jdom.*;
    import org.Jdom.input.*;
    import org.Jdom.output.*;
    public class PrettyPrinter {
    public static void main(String[] args) {
     // Assume filename argument
     String filename = args[0];
     try {
      // Build the document with SAX and Xerces, no validation
      SAXBuilder builder = new SAXBuilder();
      // Create the document
      Document doc = builder.build(new File(filename));
      // Output the document, use standard formatter
      XMLOutputter fmt = new XMLOutputter();
      fmt.output(doc, System.out);
     } catch (Exception e) {
      e.printStackTrace();
     }
    }
    }

      讀取文檔類型

      現在,讓我們來看一下怎么讀取文檔的詳細內容。許多XML文檔都有的一個東西是文檔類型,在Jdom中用DocType類來描述。萬一你不是XML方面的專家(嘿,不用灰心,你就是我們所要面向的聽眾),一個文檔類型的聲明看起來象下邊的樣子:

    <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN
    http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd

      DOCTYPE后邊的第一個詞揭示文檔被強制類型的名字,PUBLIC后邊的詞是文檔類型的公共屬性,最后一個詞是文檔類型的系統屬性。文檔屬性可以上通過文檔的getDocType()方法獲得,DocType類提供了一組獲得文檔類型聲明的方法。

    DocType docType = doc.getDocType();
    System.out.println(Element: + docType.getElementName());
    System.out.println(Public ID: + docType.getPublicID());
    System.out.println(System ID: + docType.getSystemID());


      讀取文檔數據

      每一個XML文檔必須有一個根元素。這個元素是訪問所有XML文檔內部信息的起始點。例如:這個文檔片段用<web-app>作為根元素:

    <web-app id=demo>
    。糳escription>Gotta fit servlets in somewhere!</description>
    。糳istributable/>
    </web-app>

      根元素的實例可以在文檔中直接獲得。

    Element webapp = doc.getRootElement();

      這樣,你就可以訪問這個元素的屬性(如上邊的id)內容和子節點元素。

      訪問子節點

      XML文檔是樹型結構的,任何一個元素都有可能包含任何數量的子元素。例如:<web-app>元素有<description>和 <distributable>作為子節點元素。你可以通過很多方法獲得一個元素的子元素,getChild()如果沒有子元素的話返回NULL。

    List getChildren(); // return all children
    List getChildren(String name); // return all children by name
    Element getChild(String name); // return first child by name

      示例:

    // Get a List of all direct children as Element objects
    List allChildren = element.getChildren();
    out.println(First kid: + ((Element)allChildren.get(0)).getName());
    // Get a list of all direct children with a given name
    List namedChildren = element.getChildren(name);
    // Get a list of the first kid with a given name
    Element kid = element.getChild(name);

      當文檔結構事先知道的情況下,getchild()方法很容易快速的獲得嵌套的元素。給出一個XML文檔:

    <?xml version=1.0?>
    。糽inux:config>
     。糶ui>
      。紈indow-manager>
       。糿ame>Enlightenment</name>
       。紇ersion>0.16.2</version>
      。/window-manager>
      。!-- etc -->
     。/gui>
    。/linux:config>

      下邊的代碼直接獲得window manager 的名字

    String windowManager = rootElement.getChild(gui)
    .getChild(window-manager)
    .getChild(name)
    .getText();

      如果文檔不可用要小心NullPointerExceptions異常。為了實現簡單的文檔導航,未來的Jdom可能會支持xpath。子節點可以通過getParent()獲得父節點。

      獲取文檔屬性

      屬性是元素擁有的另一組信息。html程序員對他是很熟悉的。下邊的<table>元素有width和border屬性。

    <table width=100% border=0> </table>

      這些屬性可以在元素中直接獲得。

    String width = table.getAttributeValue(width);

      你也可以用屬性實例來重新獲得這些屬性。這個能力幫助Jdom支持一些高級概念,例如名字空間中的屬性。(參考文章后邊關于名字空間的內容)

    Attribute widthAttrib = table.getAttribute(width);
    String width = widthAttrib.getValue();

      為了方便你還可以獲得這些屬性的原始數據類型。

    int width = table.getAttribute(border).getIntValue();

      你可以轉化這些數據到任何的原始數據類型。如果這些屬性不能轉換成原始數據類型就拋出一個DataConversionException異常。如果屬性不存在getAttribute()返回一個null;

      提取文檔內容

      我們為用簡單的方法獲得文檔內容而激動,下邊我們看一下用element.getText()方法提取文檔的文本內容是多么容易。這個是標準方法,適用于象下邊這樣的文檔:

    <name>Enlightenment</name>

      但是有些時候這些文檔包含注釋,文本內容和子元素。在一些高級的文檔中,它甚至包含一些處理指令:

    <table>
    。!-- Some comment -->
     Some text
    。紅r>Some child</tr>
    。?pi Some processing instruction?>
    </table>

      你可以總是通過下邊的方式獲得文本內容和子節點:

    String text = table.getText(); // Some text
    Element tr = table.getChild(tr); // <tr> child

      這使得標準使用很簡單。有些時候例如輸出,獲得一個文檔所有內容的順序是很重要的。為了這個原因,你可以使用一個特殊的方法叫getMixedContent()。它返回一個list內容可能包含注釋,字符串,元素和處理指令的實例。Java程序員可以使用instanceof 來獲得內容。下邊的代碼打印一個文檔內容的摘要:

    List mixedContent = table.getMixedContent();
    Iterator i = mixedContent.iterator();
    while (i.hasNext()) {
     Object o = i.next();
     if (o instanceof Comment) {
      // Comment has a toString()
      out.println(Comment: + o);
     }
     else if (o instanceof String) {
      out.println(String: + o);
     }
     else if (o instanceof ProcessingInstruction) {
      out.println(PI: + ((ProcessingInstriction)o).getTarget());
     }
     else if (o instanceof Element) {
      out.println(Element: + ((Element)o).getName());
     }
    }

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: java xml jdom 輕松 整合


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>