麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > XML > 正文

高效解析XML

2024-07-21 02:39:01
字體:
來源:轉載
供稿:網友

  隨著xml越來越廣泛地被采用,高效解析XML文檔也變得越來越重要。高效地解析XML數據非常重要,尤其是對于那些要處理大量數據的應用程序,這種技術尤為重要。不正確的解析會導致過度的內存消耗和過長的處理時間,從而有損于可伸縮性。
  
  XML解析器有多種類型。哪一種最適合你呢?本文研究三種流行的用于java的XML解析技術,告訴你如何根據你應用程序的要求來選擇正確的方法。
  
  XML解析器將一個未經處理的序列字符串作為輸入,并對它執行一些特定的操作。首先它檢查XML數據是否符合句法規則,確保開始標記與其有匹配的結束標記,并且沒有重疊的元素。大多數解析器還根據文檔類型定義(Document Type Definition,DTD)或XML Schema進行確認,核實其結構和內容是你所指定的。最后,解析輸出通過編程API提供對XML文檔內容的訪問。
  
  有三種用于Java的流行XML解析技術:
  
  文檔對象模型(Document Object Model,DOM),一個來自W3C的成熟標準。
  
  用于XML的簡單API(Simple API for XML,SAX),第一個被廣泛采用的用Java編寫的XML API,是一個事實上的標準。
  
  用于XML的數據流API(Streaming API for XML,StAX),JSR-173中采用的一個很有前途的新解析模型。
  
  這些技術中的每一種都有其優點和缺點。
  
  下面的XML文檔books.xml描述了一個書籍目錄,并在本文中作為例子使用:
  
  <catalog>
  <!—Sample —>
  <book id="101">
  <title>XML in a Nutshell</title>
  <author>Elliotte Rusty Harold, W. Scott Means</author>
  <price>39.95</price>
  </book>
  <book id="121">
  <title>Who Moved My Cheese</title>
  <author>Spencer, M.D. Johnson, Kenneth H. Blanchard</author>
  
  <price>19.95</price>
  </book>
  </catalog>
  
  DOM解析
  
  DOM是一個基于樹型的解析技術,它在內存中構建起一棵完整的解析樹。它可以實現對整個XML文檔的全面、動態訪問。
  
  圖 1顯示了DOM解析模型的樹型結構。文檔是所有DOM樹的根,這個根有至少一個子節點,即根元素,它是示例代碼中的catalog元素。另一個節點是DocumentType,用于DTD說明,在我們的示例中沒有定義。catalog元素有子節點,它的子節點也有自己的子節點。子節點可以是元素、文本、注釋、處理指令以及類似的信息。
  
  
 高效解析XML(圖一)

  下面的例子顯示了DOM API的用法。這個示例代碼從上一個XML文檔中打印出一個目錄下所有書籍的名稱。
  
  DOMParser parser = new DOMParser();
  
  parser.parse("books.xml");
  Document document = parser.getDocument();
  NodeList nodes =
  document.getElementsByTagName("title");
  while(int i = 0;
  i< nodes.length(); i ++) {
  Element titleElem =
  (Element)nodes.item(i);
  Node childNode =
  titleElem.getFirstChild();
  if (childNode instanceof Text) {
  System.out.PRintln("Book title is: "
  + childNode.getNodeValue());
  
  }
  }
  
  這個程序獲得XML文件名,建立DOM樹,通過使用getElementsByTagName()方法找出各個title元素的所有DOM元素節點。最后,通過重復操作title元素的列表并使用getFirstChild()方法檢查,確證第一個子節點在元素的開始和結束標記之間包含了文本,打印出與每個title元素相關的文本信息。
  
  可以看到,使用DOM非常簡單。你可以隨機地訪問XML文檔,因為整個樹都構建在內存中。通過DOM API可以修改這些節點,例如增加一個子節點或修改、刪除一個節點。

  
  雖然內存樹結構提供了很好的導航支持,但仍有一些解析策略問題需要考慮。首先,整個XML文檔必須一次解析完成,不可能只做部分解析。其次,在內存中加載整個文檔和構建完整樹結構成本很高,尤其當文檔非常大的時候。典型地,DOM樹的容量比文檔容量要大一個數量級,所以它要消耗大量內存。第三,一般的DOM節點類型在互操作性上有優勢,但對于對象類型綁定也許不是最好的。
  
  某些類型的應用程序要比其它類型的應用程序更適合采用DOM解析。當應用程序需要隨機訪問XML文檔時很適合采用DOM解析。一個比較好的例子是需要在處理模板時需要重復查找整個文件的XSL處理器。因為DOM使你能夠更新文檔,因此對于需要修改數據的應用程序,如XML編輯器來說DOM解析也很方便。
  
  SAX解析
  SAX是一個用于處理XML的事件驅動的“推”模型。它不是W3C標準,但它是一個得到了廣泛認可的API,大多數SAX解析器在實現的時候都遵循標準。SAX解析器不象DOM那樣建立一個整個文檔的樹型表示,而是在讀取文檔時激活一系列的事件。這些事件被推給事件處理器,而事件處理器則提供對文檔內容的訪問。事件處理器有三種基本類型:
  
  用于訪問XML DTD內容的DTDHandler;
  
  用于低級訪問解析錯誤的ErrorHandler;
  
  用于訪問文檔內容的最普遍類型ContentHandler。
  
  圖 2顯示了SAX解析器如何通過一個回調機制報告事件。解析器讀取輸入文檔并在處理文檔時將每個事件推給MyContentHandler。
  
  
 高效解析XML(圖二)

  
圖 2:SAX以一系列事件的方式向應用程序報告文檔。

  
  下面的例子和前一個DOM例子做同樣的事情: 打印出一本書的名稱信息。
  
  首先,編寫一個ContentHandler實現類,該類建立在DefaultHandler類基礎上,并替換你感愛好的事件類別所用的方法。該代碼拋棄來自DefaultHandler類的其他事件。定制的ContentHandler類提供回調方法,必須處理狀態治理,操作開始元素事件、結束元素事件和字符事件--為所有元素而不僅僅是title元素。
  
  public class MyContentHandler extends DefaultHandler {
  boolean isTitle;
  public void startElement(String uri, String localName,
  String qName, Attributes atts) {
  if (localName.equals("title"))
  isTitle = true;
  }
  public void endElement(String uri, String localName,
  String qName) {
  
  if(localName.equals("title"))
  isTitle = false;
  }
  public void characters(char[ ] chars, int start, int length) {
  if(isTitle)
  
  System.out.println(new String(chars, start, length));
  }
  }
  
  其次,為SAX解析器配置你的定制ContentHandler,然后該解析器開始處理XML文檔。該解析器產生相應的一些事件并在從頭至尾讀取文檔時將這些事件推給ContentHandler。
  
  SAXParser saxParser = new SAXParser();
  MyContentHandler myHandler = new
  MyContentHandler();
  
  saxParser.setContentHandler(myHandler);
  saxParser.parse(new File("books.xml"));
  
  與DOM相比,SAX解析器提供更佳的性能優勢。它提供對XML文檔內容的有效低級訪問。SAX模型最大的優點是內存消耗小,因為整個文檔無需一次加載到內存中,這使SAX解析器可以解析大于系統內存的文檔。另外,你無需象在DOM中那樣為所有節點創建對象。最后,SAX“推”模型可用于廣播環境,在這里可以注冊多個ContentHandler,并行接收事件,而不是在一個管道中只能一個接一個地處理。
  
  SAX的缺點是你必須實現處理所有到來的事件的事件處理程序。你必須在你的應用程序代碼中維護這個事件狀態。因為SAX解析器不能交流元信息,如DOM的父/子支持,所以你必須跟蹤解析器處在文檔層次的哪個位置。這樣,你的文檔越復雜,你的應用邏輯就越復雜。雖然沒有必要一次將整個文檔加載到內存中,但SAX解析器仍然需要解析整個文檔,這點和DOM一樣。
  
  也許SAX面臨的最大問題是它沒有內置如XPath所提供的那樣的導航支持。再加上它的單遍解析,這就意味著它不支持隨機訪問。這個限制也表現在名字空間上: 對有繼續名字空間的元素也不做注解。這些限制使SAX很少被選擇用于操作或修改文檔。
  
  那些只需要單遍讀取內容的應用程序可以從SAX解析中大大受益。很多B2B和EAI應用程序將XML用作封裝格式,接收端用這種格式簡單地接收所有數據。這就是SAX明顯優于DOM的地方,前者高效因而獲得的高吞吐率。SAX 2.0 有一個內置的過濾機制,可以很輕松地輸出一個文檔子集或進行簡單的文檔轉換。最后,SAX解析對根據DTD和XML Schema進行確認非常有用。
實際上,Oracle在內部使用SAX解析器來完成這種確認,比起DOM來使用更少的內存并獲得更高的效率。
  
  StAX解析
  StAX是一個令人激動的新解析技術,和SAX一樣,使用一種事件驅動的模型。然而,StAX不使用SAX的推模型,而是使用“拉”模型進行事件處理。而且StAX解析器不使用回調機制,而是根據應用程序的要求返回事件。StAX還提供了用戶友好的API用于讀入和寫出。
  
  盡管SAX向ContentHandler返回不同類型的事件,但StAX卻將它的事件返回給應用程序,甚至可以以對象的形式提供事件。
  
  圖 3顯示了當應用程序要求一個事件時,StAX解析器根據需要從XML文檔讀取并將該事件返回給該應用程序。
  
  
 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 爽成人777777婷婷 | 精品久久久久久亚洲精品 | 国产在线精品区 | 成人 日韩| 成人福利视频在线 | 国产精选电影免费在线观看 | 成人免费毛片在线观看 | 成人aaaaa片毛片按摩 | 黄色大片大毛片 | 亚洲成人国产综合 | 午夜视频免费在线观看 | 精品国产91久久久久久 | 蜜桃网在线观看 | 8x成人在线电影 | 国产午夜精品理论片a级探花 | 久久精品国产久精国产 | 色猫av| 19禁国产精品福利视频 | 欧美一级一区二区三区 | 色成人在线| 精精国产xxxx视频在线野外 | 久草在线最新 | 欧美激情天堂 | 一区国产在线观看 | 亚洲精品有限 | 国产福利不卡一区二区三区 | 久久福利剧场 | 午夜偷拍视频 | 久久2019中文字幕 | 国产精品亚洲欧美一级在线 | 在线看一区二区三区 | 午夜免费网 | 激情视频日韩 | 日本一道aⅴ不卡免费播放 久久久久久久高清 | 免费一级欧美在线观看视频 | 黄色av片三级三级三级免费看 | 国产91中文字幕 | 精品国产欧美一区二区 | 亚洲第一黄色网 | 韩国十九禁高潮床戏在线观看 | 欧美一级片网站 |