成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 處理 XML 的三種主流技術(shù)及介紹

開發(fā)
XML意為可擴(kuò)展標(biāo)記語言,它已經(jīng)是軟件開發(fā)行業(yè)中大多數(shù)程序員和廠商用以選擇作為數(shù)據(jù)傳輸?shù)妮d體。本文作者對(duì)于 Java 處理 XML 的幾種主流技術(shù)進(jìn)行一些總結(jié)和介紹,希望幫助那些有不同需求的開發(fā)人員對(duì)于 XML 處理技術(shù)的作出最優(yōu)的選擇。

XML (eXtensible Markup Language) 意為可擴(kuò)展標(biāo)記語言,它已經(jīng)是軟件開發(fā)行業(yè)中大多數(shù)程序員和廠商用以選擇作為數(shù)據(jù)傳輸?shù)妮d體。本文作者對(duì)于 Java 處理 XML 的幾種主流技術(shù)進(jìn)行一些總結(jié)和介紹,希望幫助那些有不同需求的開發(fā)人員對(duì)于 XML 處理技術(shù)的作出最優(yōu)的選擇。

最初,XML 語言僅僅是意圖用來作為 HTML 語言的替代品而出現(xiàn)的,但是隨著該語言的不斷發(fā)展和完善,人們?cè)絹碓桨l(fā)現(xiàn)它所具有的優(yōu)點(diǎn):例如標(biāo)記語言可擴(kuò)展,嚴(yán)格的語法規(guī)定,可使用有意義的標(biāo)記,內(nèi)容 存儲(chǔ)和表現(xiàn)分離等等優(yōu)勢(shì)注定了該語言從誕生之日起就會(huì)走向輝煌。 XML 語言在成為 W3C 標(biāo)準(zhǔn)之后進(jìn)入到了一個(gè)快速發(fā)展的時(shí)期,當(dāng)然它本身所具有的一系列優(yōu)點(diǎn)和優(yōu)勢(shì)也注定了各大技術(shù)廠商對(duì)它的偏愛,Java 作為軟件行業(yè)的一種開發(fā)技術(shù)也迅速作出了反應(yīng),出現(xiàn)了多種對(duì) XML 支持的工具,本文將會(huì)從這個(gè)角度對(duì) Java 處理 XML 的幾種主流技術(shù)進(jìn)行介紹,希望能對(duì)您有所幫助。在這篇文章中,您將會(huì)得到以下信息

Java 提供了哪些優(yōu)秀的類庫及工具便于程序員對(duì) XML 進(jìn)行處理 ?

有了 DOM 了,其它工具類庫還有必要么 ?

幾個(gè)小例程帶你快速了解這三種解析方式

Java 有哪些優(yōu)秀的類庫及工具便于程序員對(duì) XML 進(jìn)行處理 ?

大名鼎鼎的 DOM

綠色環(huán)保的 SAX

默默無聞的 Digester

XML 三種解析方式簡介

大名鼎鼎的 DOM

說它大名鼎鼎可是一點(diǎn)不為過,DOM 是 W3C 處理 XML 的標(biāo)準(zhǔn) API,它是許多其它與 XML 處理相關(guān)的標(biāo)準(zhǔn)的基礎(chǔ),不僅是 Java,其它諸如 Javascript,PHP,MS .NET 等等語言都實(shí)現(xiàn)了該標(biāo)準(zhǔn), 成為了應(yīng)用最為廣泛的 XML 處理方式。當(dāng)然,為了能提供更多更加強(qiáng)大的功能,Java 對(duì)于 DOM 直接擴(kuò)展工具類有很多,比如很多 Java 程序員耳熟能詳?shù)?JDOM,DOM4J 等等, 它們基本上屬于對(duì) DOM 接口功能的擴(kuò)充,保留了很多 DOM API 的特性,許多原本的 DOM 程序員甚至都沒有任何障礙就熟練掌握了另外兩者的使用,直觀、易于操作的方式使它深受廣大 Java 程序員的喜愛。

綠色環(huán)保的 SAX

SAX 的應(yīng)運(yùn)而生有它特殊的需要,為什么說它綠色環(huán)保呢,這是因?yàn)?SAX 使用了最少的系統(tǒng)資源和最快速的解析方式對(duì) XML 處理提供了支持。 但隨之而來繁瑣的查找方式也給廣大程序員帶來許多困擾,常常令人頭痛不已,同時(shí)它對(duì) XPath 查詢功能的支持,令人們對(duì)它又愛又恨。

默默無聞的 Digester:XML 的 JavaBean 化

Digester 是 apache 基金組織下的一個(gè)開源項(xiàng)目,筆者對(duì)它的了解源于對(duì) Struts 框架的研究,是否有很多程序員想要一解各大開源框架的設(shè)計(jì)甚至想要自己寫一個(gè)功能強(qiáng)大的框架時(shí)會(huì)碰到這樣一個(gè)難題: 這些形形色色的用 XML 語言標(biāo)記的框架配置文件,框架底層是用什么技術(shù)來解析呢? DOM 解析耗費(fèi)時(shí)間,SAX 解析又過于繁瑣,況且每次解析系統(tǒng)開銷也會(huì)過大, 于是,大家想到需要用與 XML 結(jié)構(gòu)相對(duì)應(yīng)的 JavaBean 來裝載這些信息,由此 Digester 應(yīng)運(yùn)而生。它的出現(xiàn)為 XML 轉(zhuǎn)換為 JavaBean 對(duì)象的需求帶來了方便的操作接口,使得更多的類似需求得到了比較完美的解決方法, 不再需要程序員自己實(shí)現(xiàn)此類繁瑣的解析程序了。與此同時(shí) SUN 也推出了 XML 和 JavaBean 轉(zhuǎn)換工具類 JAXB,有興趣的讀者可以自行了解。

三種解析方式比較

DOM

優(yōu)缺點(diǎn):實(shí)現(xiàn) W3C 標(biāo)準(zhǔn),有多種編程語言支持這種解析方式,并且這種方法本身操作上簡單快捷,十分易于初學(xué)者掌握。其處理方式是將 XML 整個(gè)作為類似樹結(jié)構(gòu)的方式讀入內(nèi)存中以便操作及解析,因此支持應(yīng)用程序?qū)?XML 數(shù)據(jù)的內(nèi)容和結(jié)構(gòu)進(jìn)行修改,但是同時(shí)由于其需要在處理開始時(shí)將整個(gè) XML 文件讀入到內(nèi)存中去進(jìn)行分析,因此其在解析大數(shù)據(jù)量的 XML 文件時(shí)會(huì)遇到類似于內(nèi)存泄露以及程序崩潰的風(fēng)險(xiǎn),請(qǐng)對(duì)這點(diǎn)多加注意。

適用范圍:小型 XML 文件解析、需要全解析或者大部分解析 XML、需要修改 XML 樹內(nèi)容以生成自己的對(duì)象模型

SAX

SAX 從根本上解決了 DOM 在解析 XML 文檔時(shí)產(chǎn)生的占用大量資源的問題。其實(shí)現(xiàn)是通過類似于流解析的技術(shù),通讀整個(gè) XML 文檔樹,通過事件處理器來響應(yīng)程序員對(duì)于 XML 數(shù)據(jù)解析的需求。由于其不需要將整個(gè) XML 文檔讀入內(nèi)存當(dāng)中,它對(duì)系統(tǒng)資源的節(jié)省是十分顯而易見的,它在一些需要處理大型 XML 文檔以及性能要求較高的場合有起了十分重要的作用。支持 XPath 查詢的 SAX 使得開發(fā)人員更加靈活,處理起 XML 來更加的得心應(yīng)手。但是同時(shí),其仍然有一些不足之處也困擾廣大的開發(fā)人員:首先是它十分復(fù)雜的 API 接口令人望而生畏,其次由于其是屬于類似流解析的文件掃描方式,因此不支持應(yīng)用程序?qū)τ?XML 樹內(nèi)容結(jié)構(gòu)等的修改,可能會(huì)有不便之處。

適用范圍:大型 XML 文件解析、只需要部分解析或者只想取得部分 XML 樹內(nèi)容、有 XPath 查詢需求、有自己生成特定 XML 樹對(duì)象模型的需求

Digester/JAXB

優(yōu)缺點(diǎn) : 由于其是在上述兩者的基礎(chǔ)上衍生出來的工具類,為的是滿足將 XML 轉(zhuǎn)換為 JavaBean 的特殊需求,故而沒有什么特別明顯的優(yōu)缺點(diǎn)。作為大名鼎鼎的開源框架 Struts 的 XML 解析工具 Digester,為我們帶來了將 XML 轉(zhuǎn)換為 JavaBean 的可靠方法。

適用范圍 : 有將 XML 文檔直接轉(zhuǎn)換為 JavaBean 需求。

應(yīng)用示例請(qǐng)見第二頁

#p#

下面給出一段用于解析的 XML 片段:

  1. <?xml version="1.0" encoding="UTF-8"?>   
  2.  <books>   
  3.    <book id="001">   
  4.       <title>Harry Potter</title>   
  5.       <author>J K. Rowling</author>   
  6.    </book>   
  7.    <book id="002">   
  8.       <title>Learning XML</title>   
  9.       <author>Erik T. Ray</author>   
  10.    </book>   
  11.  </books>  

DOM 解析 XML

Java 中的 DOM 接口簡介: JDK 中的 DOM API 遵循 W3C DOM 規(guī)范,其中 org.w3c.dom 包提供了 Document、DocumentType、Node、NodeList、Element 等接口, 這些接口均是訪問 DOM 文檔所必須的。我們可以利用這些接口創(chuàng)建、遍歷、修改 DOM 文檔。

javax.xml.parsers 包中的 DoumentBuilder 和 DocumentBuilderFactory 用于解析 XML 文檔生成對(duì)應(yīng)的 DOM Document 對(duì)象。

javax.xml.transform.dom 和 javax.xml.transform.stream 包中 DOMSource 類和 StreamSource 類,用于將更新后的 DOM 文檔寫入 XML 文件。

下面給出一個(gè)運(yùn)用 DOM 解析 XML 的例子:

  1. import java.io.File;   
  2. import java.io.IOException;   
  3. import javax.xml.parsers.DocumentBuilder;   
  4. import javax.xml.parsers.DocumentBuilderFactory;   
  5. import javax.xml.parsers.ParserConfigurationException;   
  6. import org.w3c.dom.Document;   
  7. import org.w3c.dom.Element;   
  8. import org.w3c.dom.Node;   
  9. import org.w3c.dom.NodeList;   
  10. import org.xml.sax.SAXException;   
  11.  
  12. public class DOMParser {   
  13.   DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();   
  14.   //Load and parse XML file into DOM   
  15.   public Document parse(String filePath) {   
  16.      Document document = null;   
  17.      try {   
  18.         //DOM parser instance   
  19.         DocumentBuilder builder = builderFactory.newDocumentBuilder();   
  20.         //parse an XML file into a DOM tree   
  21.         document = builder.parse(new File(filePath));   
  22.      } catch (ParserConfigurationException e) {   
  23.         e.printStackTrace();    
  24.      } catch (SAXException e) {   
  25.         e.printStackTrace();   
  26.      } catch (IOException e) {   
  27.         e.printStackTrace();   
  28.      }   
  29.      return document;   
  30.   }   
  31.  
  32.   public static void main(String[] args) {   
  33.         DOMParser parser = new DOMParser();   
  34.         Document document = parser.parse("books.xml");   
  35.         //get root element   
  36.         Element rootElement = document.getDocumentElement();   
  37.  
  38.         //traverse child elements   
  39.         NodeList nodes = rootElement.getChildNodes();   
  40.         for (int i=0; i < nodes.getLength(); i++)   
  41.         {   
  42.            Node node = nodes.item(i);   
  43.            if (node.getNodeType() == Node.ELEMENT_NODE) {     
  44.               Element child = (Element) node;   
  45.               //process child element   
  46.            }   
  47.         }   
  48.  
  49.         NodeList nodeList = rootElement.getElementsByTagName("book");   
  50.         if(nodeList != null)   
  51.         {   
  52.            for (int i = 0 ; i < nodeList.getLength(); i++)   
  53.            {   
  54.               Element element = (Element)nodeList.item(i);   
  55.               String id = element.getAttribute("id");   
  56.            }   
  57.         }   
  58.   }   
  59. }  

在上面的例子中,DOMParser 的 Parse() 方法負(fù)責(zé)解析 XML 文件并生成對(duì)應(yīng)的 DOM Document 對(duì)象。其中 DocumentBuilderFactory 用于生成 DOM 文檔解析器以便解析 XML 文檔。 在獲取了 XML 文件對(duì)應(yīng)的 Document 對(duì)象之后,我們可以調(diào)用一系列的 API 方便的對(duì)文檔對(duì)象模型中的元素進(jìn)行訪問和處理。 需要注意的是調(diào)用 Element 對(duì)象的 getChildNodes() 方法時(shí)將返回其下所有的子節(jié)點(diǎn),其中包括空白節(jié)點(diǎn),因此需要在處理子 Element 之前對(duì)節(jié)點(diǎn)類型加以判斷。

可以看出 DOM 解析 XML 易于開發(fā),只需要通過解析器建立起 XML 對(duì)應(yīng)的 DOM 樹型結(jié)構(gòu)后便可以方便的使用 API 對(duì)節(jié)點(diǎn)進(jìn)行訪問和處理,支持節(jié)點(diǎn)的刪除和修改等。 但是 DOM 解析 XML 文件時(shí)會(huì)將整個(gè) XML 文件的內(nèi)容解析成樹型結(jié)構(gòu)存放在內(nèi)存中,因此不適合用 DOM 解析很大的 XML 文件。

SAX 解析 XML

與 DOM 建立樹形結(jié)構(gòu)的方式不同,SAX 采用事件模型來解析 XML 文檔,是解析 XML 文檔的一種更快速、更輕量的方法。 利用 SAX 可以對(duì) XML 文檔進(jìn)行有選擇的解析和訪問,而不必像 DOM 那樣加載整個(gè)文檔,因此它對(duì)內(nèi)存的要求較低。 但 SAX 對(duì) XML 文檔的解析為一次性讀取,不創(chuàng)建任何文檔對(duì)象,很難同時(shí)訪問文檔中的多處數(shù)據(jù)。

下面是一個(gè) SAX 解析 XML 的例子:

  1. import org.xml.sax.Attributes;   
  2. import org.xml.sax.SAXException;   
  3. import org.xml.sax.XMLReader;   
  4. import org.xml.sax.helpers.DefaultHandler;   
  5. import org.xml.sax.helpers.XMLReaderFactory;   
  6.  
  7. public class SAXParser {   
  8.  
  9.   class BookHandler extends DefaultHandler {   
  10.      private List<String> nameList;   
  11.      private boolean title = false;   
  12.     
  13.      public List<String> getNameList() {   
  14.         return nameList;   
  15.      }   
  16.      // Called at start of an XML document   
  17.      @Override   
  18.      public void startDocument() throws SAXException {   
  19.         System.out.println("Start parsing document...");   
  20.         nameList = new ArrayList<String>();   
  21.      }   
  22.      // Called at end of an XML document   
  23.      @Override   
  24.      public void endDocument() throws SAXException {    
  25.         System.out.println("End");    
  26.      }   
  27.        
  28.      /**   
  29.       * Start processing of an element.   
  30.       * @param namespaceURI  Namespace URI   
  31.       * @param localName  The local name, without prefix   
  32.       * @param qName  The qualified name, with prefix   
  33.       * @param atts  The attributes of the element   
  34.       */   
  35.      @Override   
  36.      public void startElement(String uri, String localName, String qName,   
  37.      Attributes atts) throws SAXException {   
  38.         // Using qualified name because we are not using xmlns prefixes here.   
  39.         if (qName.equals("title")) {   
  40.            title = true;   
  41.         }   
  42.      }   
  43.     
  44.      @Override   
  45.      public void endElement(String namespaceURI, String localName, String qName)   
  46.         throws SAXException {   
  47.         // End of processing current element   
  48.         if (title) {   
  49.            title = false;   
  50.         }   
  51.      }   
  52.               
  53.      @Override   
  54.      public void characters(char[] ch, int start, int length) {   
  55.         // Processing character data inside an element   
  56.         if (title) {   
  57.            String bookTitle = new String(ch, start, length);   
  58.            System.out.println("Book title: " + bookTitle);   
  59.            nameList.add(bookTitle);   
  60.         }   
  61.      }   
  62.           
  63.   }   
  64.  
  65.   public static void main(String[] args) throws SAXException, IOException {   
  66.      XMLReader parser = XMLReaderFactory.createXMLReader();   
  67.      BookHandler bookHandler = (new SAXParser()).new BookHandler();   
  68.      parser.setContentHandler(bookHandler);   
  69.      parser.parse("books.xml");   
  70.      System.out.println(bookHandler.getNameList());   
  71.   }   
  72. }  

SAX 解析器接口和事件處理器接口定義在 org.xml.sax 包中。主要的接口包括 ContentHandler、DTDHandler、EntityResolver 及 ErrorHandler。 其中 ContentHandler 是主要的處理器接口,用于處理基本的文檔解析事件;DTDHandler 和 EntityResolver 接口用于處理與 DTD 驗(yàn)證和實(shí)體解析相關(guān)的事件; ErrorHandler 是基本的錯(cuò)誤處理接口。DefaultHandler 類實(shí)現(xiàn)了上述四個(gè)事件處理接口。上面的例子中 BookHandler 繼承了 DefaultHandler 類, 并覆蓋了其中的五個(gè)回調(diào)方法 startDocument()、endDocument()、startElement()、endElement() 及 characters() 以加入自己的事件處理邏輯。

Digester 解析 XML

為了滿足將 XML 轉(zhuǎn)換為 JavaBean 的特殊需求,Apache 旗下的一個(gè)名為 Digester 的工具為我們提供了這么一個(gè)選擇。由于最終是將 XML 轉(zhuǎn)化為 JavaBean 存儲(chǔ)在內(nèi)存當(dāng)中, 故而解析性能等方面其實(shí)與使用者并沒有多大關(guān)系。解析的關(guān)鍵在于用以匹配 XML 的模式以及規(guī)則等,由于該工具較為復(fù)雜,限于篇幅,作者只能給予簡單的介紹。

下面是一個(gè) Digester 解析 XML 的例子片段:

  1. // 定義要解析的 XML 的路徑,并初始化工具類  
  2. File input = new File("books.xml");   
  3. Digester digester = new Digester();   
  4.  
  5. // 如果碰到了 <books> 這個(gè)標(biāo)簽,應(yīng)該初始化 test.myBean.Books 這個(gè) JavaBean 并填裝相關(guān)內(nèi)容  
  6. digester.addObjectCreate("books""test.myBean.Books");   
  7. digester.addSetProperties("books");   
  8. // 如果碰到了 <books/book> 這個(gè)標(biāo)簽,同上初始化 test.myBean.Book 這個(gè) JavaBean   
  9. digester.addObjectCreate("books/book""test.myBean.Book");   
  10. digester.addSetProperties("books/book");   
  11. // 通過調(diào)用上面已經(jīng)初始化過的 JavaBean 的 addBook() 方法來把多個(gè) <books/book> 加到一個(gè)集合中  
  12. digester.addSetNext("books/book""addBook""test.myBean.Book");   
  13.  
  14. // 定義好了上面的解析規(guī)則后,就可以開始進(jìn)行解析工作了  
  15. Books books = (Books) digester.parse(input);  

上述代碼簡單的向讀者展示了 Digester 處理 XML 的一些要點(diǎn),主要是說明了一些模式以及規(guī)則的匹配。 簡言之,Digester 就是一種用來把一個(gè) XML 轉(zhuǎn)化為一個(gè)與該 XML 結(jié)構(gòu)類似的 JavaBean。你可以把 XML 根元素想象成一個(gè) JavaBean, 該根元素的 attribute 就是這個(gè) JavaBean 的各種 Field,當(dāng)該根元素有其他子 tag 時(shí),又要把這個(gè)子 tag 想象成一個(gè)個(gè)新的 XML,將其視為一個(gè)新的 JavaBean, 并作為一個(gè) Field 加入到父 Bean 當(dāng)中,然后以此類推,通過循環(huán)的方式將整個(gè) XML 進(jìn)行解析。

結(jié)束語

本文介紹了 Java 解析 XML 的三種常用技術(shù),其中 DOM 易于上手,程序易于理解,但缺點(diǎn)在于占用內(nèi)存大,不適合于解析較大的 XML 文件; SAX 基于事件模型占用系統(tǒng)資源少,能夠勝任較大的 XML 文件解析,但解析過程較為繁瑣查找元素不方便; Digester/JAXB 基于上述兩種技術(shù)衍生而來。文中的實(shí)例向讀者展示了三種 API 的基本使用方法, 在實(shí)際開發(fā)過程中使用那種技術(shù)解析 XML 更好要依據(jù)各自的優(yōu)缺點(diǎn)視具體情況而定。

原文鏈接:http://www.ibm.com/developerworks/cn/xml/dm-1208gub/index.html

【編輯推薦】

  1. JSON真的比XML好很多嗎?
  2. 談?wù)剬?duì)象和XML文件的轉(zhuǎn)換
  3. 利用 JDBC 將數(shù)據(jù)提取到 XML 之中
  4. 面試體驗(yàn):Microsoft 篇
  5. 面試體驗(yàn):Google篇

 

責(zé)任編輯:張偉 來源: IBM
相關(guān)推薦

2012-08-15 10:44:07

JavaXML

2010-04-20 12:00:01

負(fù)載均衡技術(shù)

2009-09-22 12:39:04

2023-04-13 07:41:14

RoCE技術(shù)RDMA

2012-05-31 09:50:26

開源CMS

2018-03-06 14:44:59

2009-08-04 09:09:56

Java常見異常

2020-11-01 17:10:46

異步事件開發(fā)前端

2019-04-15 13:52:18

微服務(wù)配置中心Apollo

2019-11-04 08:38:45

分布式事務(wù)主流TCC

2020-11-03 19:52:54

Java數(shù)組編程語言

2020-12-28 10:35:38

前端數(shù)據(jù)技術(shù)

2010-07-05 18:32:25

2021-11-23 10:30:35

Android技術(shù)代碼

2012-08-07 10:02:06

JSP

2010-03-01 15:21:57

WCF死鎖

2010-04-14 17:38:41

Oracle數(shù)據(jù)庫

2009-06-09 16:53:22

Java Swing處理方法比較

2011-01-18 15:35:59

jQueryJavaScriptweb

2017-04-19 16:30:51

SDNNFV網(wǎng)絡(luò)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美a级成人淫片免费看 | 中文字幕男人的天堂 | 国产精品一区二区三区在线 | 一区二区日韩 | 成人影音| 日本久久一区二区三区 | 精品中文视频 | 久久久久综合 | 精品一区二区久久久久久久网站 | 欧美在线视频观看 | 午夜影院视频在线观看 | 瑟瑟视频在线看 | 在线成人免费av | 国产一级片久久久 | 日韩在线观看网站 | 91在线观看 | 999精品视频| 国产极品91| 亚洲欧美日本在线 | 久久99精品久久久久久 | 国产欧美一区二区三区国产幕精品 | 亚洲精品66| 亚洲视频免费观看 | 在线播放国产一区二区三区 | 国产精品99久久久久久宅男 | 久久精品国产亚洲 | 成人在线一区二区 | 99精品一区二区 | 91婷婷韩国欧美一区二区 | 免费的黄色片子 | 亚洲97| 国产精品久久av | 中文字幕在线免费观看 | 免费激情网站 | 中文字幕欧美一区 | 成人精品鲁一区一区二区 | 手机av在线 | 日本涩涩视频 | 亚洲一区二区三区四区五区中文 | 日韩精品一区二区三区中文字幕 | 亚洲精品一区二区网址 |