使用stax解析xml

          StAX 框架(Streaming API for XML)

          SAX 框架的缺點(diǎn)是不能記錄正在處理元素的上下文。但是優(yōu)點(diǎn)是運(yùn)行時(shí)占內(nèi)存空間比較小,效率高。DOM 框架由于在處理 XML 時(shí)需要為其構(gòu)造一棵樹(shù),所以特點(diǎn)正好相反。StAX 框架出現(xiàn)于 Java SE 6 中,它的設(shè)計(jì)目標(biāo)就是要結(jié)合 SAX 框架和 DOM 框架的優(yōu)點(diǎn)。既要求運(yùn)行時(shí)效率,也要求保持元素的上下文狀態(tài)。清單 5 是一段使用 StAX 框架處理 XML 文件的代碼。


          清單 5. 使用 StAX 框架處理 XML 文件
                      import java.io.*;
                      import javax.xml.stream.*;
                      import javax.xml.stream.events.*;
                      public class StAXTest {
                      public static void main(String[] args) {
                      XMLInputFactory inputFactory = XMLInputFactory.newInstance();
                      InputStream input = new ByteArrayInputStream(
                      ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                      "<work-contact-info>" +
                      "<Location>Shanghai-shuion-333</Location>" +
                      "<Postal>200020</Postal>" +
                      "<Tel><fix>63262299</fix><mobile>1581344454</mobile></Tel>" +
                      "<Appellation>Mr. Wang</Appellation>" +
                      "</work-contact-info>").getBytes());
                      try {
                      XMLEventReader xmlEventReader = inputFactory.createXMLEventReader(input);
                      while (xmlEventReader.hasNext()) {
                      XMLEvent event = xmlEventReader.nextEvent();
                      if (event.isStartElement()) {
                      StartElement startElement = event.asStartElement();
                      System.out.println(startElement.getName().toString());
                      }
                      if (event.isCharacters()) {
                      Characters text = event.asCharacters();
                      if (!text.isWhiteSpace()) {
                      System.out.println("\t" + text.getData());
                      }
                      }
                      }
                      } catch (XMLStreamException e) {
                      e.printStackTrace();
                      }
                      }
                      }
                      

          觀察后可以發(fā)現(xiàn) StAX 框架和 SAX 框架具有相似的地方。StAX 有 Event.isStartElement 方法,SAX 有 DefaultHandler.startElement 方法。StAX 有 Event.isCharacter 方法,SAX 有 DefaultHandler.character 方法。實(shí)際上這兩個(gè)框架處理 XML 文件的時(shí)候使用了相似的模型——將 XML 文件作為元素組成的流,而不同于 DOM 的樹(shù)模型。解析 XML 文件時(shí),應(yīng)用程序調(diào)用 XMLEventReadernextEvent 方法解析下一個(gè)元素(或者是解析同一個(gè)元素,根據(jù)解析的不同階段,產(chǎn)生不同元素),StAX 就會(huì)通過(guò) XMLEventReader 產(chǎn)生一個(gè)事件。比如針對(duì)同一個(gè)元素,可能會(huì)產(chǎn)生 StartElementEndElement 事件。形象的說(shuō) XMLEventReader 就像是一根繩子,拽一下,解析一個(gè)元素,產(chǎn)生一個(gè)事件。于是這種技術(shù)也被稱為”Pull Parser”技術(shù)。StAX 在處理 XML 文件時(shí),產(chǎn)生的所有事件是通過(guò)一個(gè) IteratorXMLEventReader 繼承了 Iterator)返回的。應(yīng)用程序通過(guò)這個(gè) Iterator 能知道某個(gè)解析事件的前后分別是什么。這類信息就是一個(gè)元素的上下文信息。

          posted on 2007-12-04 11:43 劉錚 閱讀(598) 評(píng)論(0)  編輯  收藏 所屬分類: XML

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          統(tǒng)計(jì)

          留言簿(1)

          文章分類(141)

          文章檔案(147)

          搜索

          最新評(píng)論

          主站蜘蛛池模板: 西青区| 财经| 夏邑县| 客服| 嘉峪关市| 岳阳县| 榆中县| 洱源县| 大连市| 平山县| 朝阳市| 昌黎县| 静宁县| 宣汉县| 易门县| 洪湖市| 龙南县| 福州市| 长宁县| 高台县| 长汀县| 乐至县| 长沙市| 无为县| 拜泉县| 台东县| 城口县| 康乐县| 哈尔滨市| 基隆市| 蒙阴县| 盐津县| 广河县| 凤翔县| 隆林| 武乡县| 花莲县| 阳高县| 神木县| 临桂县| 济宁市|