亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 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文檔讀取并將該事件返回給該應用程序。
  
  
 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美专区日韩视频| 久久久精品一区| 亚洲精品网站在线播放gif| 日韩美女视频免费看| 色av吧综合网| 国产精品免费一区二区三区都可以| 自拍视频国产精品| 精品久久久av| 国产精品高潮在线| 热久久这里只有精品| 国产成人免费av| 成人网在线免费观看| 久青草国产97香蕉在线视频| 国产精品电影久久久久电影网| 亚洲国产精品成人va在线观看| 尤物九九久久国产精品的分类| 国产精品久久久久久久久久三级| 午夜精品在线观看| 久久久久久91| 欧美性受xxxx黑人猛交| 欧美肥臀大乳一区二区免费视频| 欧美激情综合亚洲一二区| 国模视频一区二区三区| 亚洲激情中文字幕| 久久香蕉国产线看观看av| 日韩在线观看网站| 久久97久久97精品免视看| 97色在线视频观看| 欧美夜福利tv在线| 日韩av在线免播放器| 亚洲第一网站男人都懂| 26uuu亚洲国产精品| 国产亚洲精品一区二区| 亚洲视频电影图片偷拍一区| 久久久久久久久久久国产| 亚洲四色影视在线观看| 久久精品国产亚洲精品2020| 欧美激情视频三区| 国产精品一区二区久久久久| 国产精品爽爽爽| 97在线免费观看| 北条麻妃久久精品| 日韩av最新在线| 国产精品av电影| 91豆花精品一区| 岛国av在线不卡| 日韩av电影国产| 亚洲欧美色婷婷| 国产91在线播放精品91| 午夜精品久久久久久久久久久久久| 亚洲精品国产拍免费91在线| 777国产偷窥盗摄精品视频| 亚洲高清色综合| 在线视频欧美性高潮| 国产精国产精品| 欧美在线观看网站| 最近2019年中文视频免费在线观看| 国产精品69久久| 欧美电影电视剧在线观看| 日韩在线观看免费av| 久久久免费av| 国产视频久久久| 国产精品视频xxx| 欧美极品少妇全裸体| 91沈先生在线观看| 亚洲丝袜一区在线| 狠狠久久五月精品中文字幕| 国产精品男人的天堂| 国产日本欧美一区二区三区| 亚洲欧美激情另类校园| 欧美性极品少妇精品网站| www国产亚洲精品久久网站| 亚洲美女精品久久| 成人精品在线观看| 国产中文字幕亚洲| 国产亚洲成精品久久| 亚洲成人中文字幕| 久久久久久久999精品视频| 日韩av一区二区在线观看| 日韩av电影在线播放| 亚洲电影免费观看高清完整版| 国产香蕉97碰碰久久人人| 欧美一区二区大胆人体摄影专业网站| 国产成人av在线播放| 国产欧洲精品视频| 91精品国产综合久久香蕉最新版| 91精品国产精品| 欧美一级大片视频| 日韩电视剧免费观看网站| 亚洲精品一区二区三区不| 亚洲新声在线观看| 欧美疯狂做受xxxx高潮| 久久国产一区二区三区| 亚洲精品aⅴ中文字幕乱码| 爽爽爽爽爽爽爽成人免费观看| 热久久免费国产视频| 日本精品一区二区三区在线播放视频| 秋霞午夜一区二区| 国产精品第100页| 性欧美xxxx交| www.xxxx欧美| 欧美第一淫aaasss性| 国产精品都在这里| 欧美日韩性视频| 国内免费精品永久在线视频| 高清欧美一区二区三区| 国产69精品久久久| 久久久视频免费观看| 在线观看久久av| 久久精品男人天堂| 久久久久久久久爱| 69影院欧美专区视频| 久久五月天色综合| 欧美激情视频三区| 久久成人人人人精品欧| 日韩亚洲欧美中文高清在线| 亚洲美女av在线| 日韩精品视频免费在线观看| 国产精品久久久精品| 久久久久久久91| 亚洲欧洲国产一区| www.亚洲一二| 亚洲xxxx妇黄裸体| 亚洲欧美国产高清va在线播| 国产精品99久久久久久人| 91精品久久久久久| 欧美精品videosex极品1| 亚洲国产精品人久久电影| 久久精品国产一区| 狠狠综合久久av一区二区小说| 日韩欧美成人网| 国产原创欧美精品| 国产视频亚洲视频| 欧美精品免费看| www.日韩.com| 成人观看高清在线观看免费| 国产精品欧美风情| 亚洲国语精品自产拍在线观看| 69视频在线播放| 国产在线精品成人一区二区三区| 日韩精品中文字幕久久臀| 亚洲成色999久久网站| 国产欧美精品一区二区| 欧美美女15p| www.亚洲人.com| 欧美激情视频在线| 久久亚洲精品一区| 国产成人一区二区三区小说| 一本色道久久综合亚洲精品小说| 色香阁99久久精品久久久| 欧美极品第一页| 国产精品嫩草影院一区二区| 日韩中文在线中文网在线观看| 91在线观看免费高清| 日韩免费在线观看视频| 91沈先生作品| 欧美成人精品一区| 中文字幕亚洲字幕| 在线观看国产精品淫| 精品福利免费观看| 亚洲伊人久久综合| 国产精品久久久久久av| 九九热r在线视频精品| 热久久视久久精品18亚洲精品|