隨筆 - 14, 文章 - 0, 評論 - 15, 引用 - 0
          數(shù)據(jù)加載中……

          java&xml第四天,sax

          SAX(Simple API for XML用于XML的簡單API)
          由于提前學(xué)習(xí)了cocoon,時(shí)間上又經(jīng)過了一個(gè)周末,想要寫得激情沒有剩下多少,這里簡單的回顧一下SAX的一些接口定義和用處吧!-_-#
          1、準(zhǔn)備工作
                sax相關(guān)的類都封裝在org.xml.sax中,其中接口org.xml.sax.XMLReader是SAX2的核心類,你的xml解析器應(yīng)該提供這個(gè)接口的實(shí)現(xiàn)類。比如"org.apache.xerces.parsers.SAXParser"這個(gè)類。
          2、sax的處理流程
                sax基本的處理方法是在解析之前注冊各種處理類(Handler),在解析的時(shí)候callback這些處理器,內(nèi)容處理器就是其中最主要的一個(gè)。舉例來說明的話,如下的xml文檔:
          <?xml version="1.0"?>
            
          <samples>
              
          <server>UNIX</server>
              
          <monitor>color</monitor>
            
          </samples>
          他將會(huì)在解析的時(shí)候被轉(zhuǎn)化成如下的一串事件流:
              Start document
              Start element (samples)
              Characters (white space)
              Start element (server)
              Characters (UNIX)
              End element (server)
              Characters (white space)
              Start element (monitor)
              Characters (color)
              End element (monitor)
              Characters (white space)
              End element (samples)
          開發(fā)者要做的就是捕獲這些事件,然后做自己要做的事情。
          3、內(nèi)容處理類
                org.xml.sax.ContentHandler
          package org.xml.sax;
          public interface ContentHandler
          {
              
          public void setDocumentLocator (Locator locator);
              
          public void startDocument ()throws SAXException;
              
          public void endDocument()throws SAXException;
              
          public void startPrefixMapping (String prefix, String uri) throws SAXException;
              
          public void endPrefixMapping (String prefix)throws SAXException;
                 public void startElement (String namespaceURI, String localName,String qName, Attributes atts)
                 throws SAXException;
              
          public void endElement (String namespaceURI, String localName,String qName)throws SAXException;
              
          public void characters (char ch[], int start, int length)throws SAXException;
              
          public void ignorableWhitespace (char ch[], int start, int length)throws SAXException;
              
          public void processingInstruction (String target, String data)throws SAXException;
              
          public void skippedEntity (String name)throws SAXException;
          }
          有一點(diǎn)要說明的就是ignorableWhitespace 這個(gè)方法是在遇到可以忽略的空白的時(shí)候回調(diào)的,但是如果xml文檔沒有定義DTD或者是Schema,那么這個(gè)方法將不會(huì)被調(diào)用,因?yàn)槿绻麤]有文檔結(jié)構(gòu)的定義,解析器又如何判斷哪些空白是可以忽略的呢。
          4、錯(cuò)誤處理類
                ErrorHandler這個(gè)類提供兩個(gè)方法,warning和error,用于在處理解析過程發(fā)生的錯(cuò)誤和警告,包括xml格式的錯(cuò)誤和文檔結(jié)構(gòu)檢查的錯(cuò)誤。
          5、過濾器和寫入器
                org.xml.sax.XMLFilter這個(gè)接口擴(kuò)展了XMLReader接口,添加了兩個(gè)新方法:
                public void setParent(XMLReader reader);
                public XMLReader getParent();
                他的意圖比較明顯,將一個(gè)已有的XMLReader作為上級解析器,他將得以在這個(gè)XMLReader執(zhí)行捕獲sax事件之前捕獲他們,并作一些操作,最后在鏈向XMLReader的對象,這里的概念很像cocoon的內(nèi)部實(shí)現(xiàn)。
                這里還要提到的一個(gè)類是:org.xml.sax.helpers.XMLFilterImpl這個(gè)類實(shí)現(xiàn)了XMLFilter接口,不僅如此,他還提供了ContentHandler,ErrorHandler等處理器的處理方法通道。也就是說,如果繼承XMLFilterImpl并覆蓋startElement方法,那么你寫得代碼將在實(shí)際的Reader執(zhí)行startElement方法被執(zhí)行之前被執(zhí)行。下面是一個(gè)注冊Filter的例子:
          XMLReader reader = XMLReaderFactory.createXMLreader();
          MyFilter filter 
          = new MyFilter(reader.);
          filter.setContenHandler();

          注意在注冊內(nèi)容處理類等類的時(shí)候,應(yīng)該寫filter....
          另外,你當(dāng)然也可以再寫一個(gè)filter2,而把filter作為parent傳入,這樣就構(gòu)成了一個(gè)事件處理鏈。

                org.xml.sax.XMLWriter是一個(gè)實(shí)際的過濾器,他也是通過上面說到的方式:擴(kuò)展XMLFilterImpl來實(shí)現(xiàn)的。具體的類除了XMLWriter外還有DataWriter,他擴(kuò)展XMLWriter。
                需要注意的是這兩個(gè)類一般不用來做實(shí)際的寫入流操作,但是他們可以用于很好的表現(xiàn)sax處理鏈的中間結(jié)果,也就是快照snapshot
          6、sax的屬性和特征
                屬性和特征在XMLReader接口里面體現(xiàn)為:
                getFeature(String),setFeature(String,boolean)方法和getProperty(String),setProperty(String,Object)方法,用來控制解析過程的一些選項(xiàng),比如是否進(jìn)行DTD校驗(yàn)。比如:
                reader.setFeature("reader.setFeature("

          posted on 2005-03-14 13:26 Boris-Java 閱讀(921) 評論(0)  編輯  收藏 所屬分類: java&xml

          主站蜘蛛池模板: 五常市| 武隆县| 丹寨县| 都兰县| 丽水市| 礼泉县| 南华县| 格尔木市| 武强县| 若羌县| 四会市| 丰城市| 砀山县| 陕西省| 布尔津县| 栖霞市| 收藏| 天台县| 古蔺县| 深水埗区| 平顶山市| 台南县| 化德县| 宝清县| 民县| 澄江县| 西盟| 五寨县| 池州市| 鞍山市| 万荣县| 萝北县| 内丘县| 仲巴县| 高青县| 东乌珠穆沁旗| 上思县| 定兴县| 江油市| 南京市| 西和县|