小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java API for XML Parsing(JAXP)演進(jìn)

 jinzq 2007-09-24
http://www./Java/HTML/75888.html

簡(jiǎn)介
  
在1998年W3CXML1.0推薦標(biāo)準(zhǔn)發(fā)布之后,XML就開始變得很流行。Sun公司就是在那時(shí)候規(guī)范Java Community Process (JCP),同時(shí)JAXP(JSR-05)的第一版在2000早些時(shí)候發(fā)布了。這個(gè)版本得到了很多工業(yè)集團(tuán)的支持,譬如(以年月次序排列)BEA Systems, Fujitsu Limited, Hewlett-Packard, IBM, Netscape Communications, Oracle, and Sun Microsystems, Inc.
  
  JAXP (全稱Java API for XML Parsing)的可插拔性(pluggability)在開發(fā)社區(qū)里引起很大的轟動(dòng)。這點(diǎn)也是JAXP的精華所在。開發(fā)人員可以編寫自己的xml處理 器,只要它符合JAXP的APIs,這樣底層不同的xml處理器可以任意切換而不用改應(yīng)用程序的代碼。
  
  那JAXP到底是什么呢?首先 這個(gè)P有點(diǎn)迷惑,它代表Parsing還是Processing呢?
  
  因?yàn)镴AXP1.0的時(shí)候只支持解析(parsing),所以JAXP全稱應(yīng)該是Java API for XML Parsing.
  
但在JAXP1.1的時(shí)候,XSL-T被推薦用作XML的轉(zhuǎn)換(transformation)處理。很遺憾,當(dāng)時(shí)W3C XLT-T的標(biāo)準(zhǔn)規(guī)范(specification)里沒(méi)有提供任何用來(lái)轉(zhuǎn)換(transformation)處理的APIs。因此JAXP1.1的專家 組推薦了一組APIs叫Transformation API for XML (TrAX)。
  
  從此JAXP就叫Java API for XML Processing. JAXP通過(guò)逐步進(jìn)化,支持的東西也越來(lái)越多
  
  不僅僅是解析xml文件(譬如在解析文檔的時(shí)候根據(jù)schema校驗(yàn)有效性,根據(jù)預(yù)解析的schema來(lái)校驗(yàn)文檔有效性,計(jì)算XPath 表達(dá)式等等)。
  
  由于底層用來(lái)處理xml文檔的可插拔的processor是任意編寫的,只要它符合JAXP的規(guī)范,因此JAXP 是一個(gè)輕量級(jí)的處理xml文件的處理APIs。(譯者注:JAXP只是一個(gè)api規(guī)范而已,真正底層實(shí)現(xiàn)是任意的。后面會(huì)有具體介紹。)
  
  使用JAXP來(lái)解析XML文檔
  
JAXP支持基于對(duì)象和基于事件的兩種解析方式?;趯?duì)象的解析,到目前為止只支持W3C DOM解析,JAXP的專家組可能在JAXP的將來(lái)版本中會(huì)支持J-DOM規(guī)范?;谑录慕馕?,只有SAX 解析模式被支持,另一個(gè)基于事件的解析模式叫Pull Parsing,本來(lái)它應(yīng)該是JAXP的一部分。但是對(duì)于Pull Parsing存在有一份不同的JSR (#173)文檔,也就是大家所知道的Streaming API for XML (StAX) parsing,現(xiàn)在我們對(duì)于那個(gè)也沒(méi)什么更多的可以做了。
  

 
  Figure 1: Various mechanism of parsing XML


  
  使用SAX來(lái)解析XML文檔
  
SAX APIs 是在1998年的早些時(shí)候由David Megginson提出的,目標(biāo)是成為基于事件驅(qū)動(dòng)的xml文檔解析模式的標(biāo)準(zhǔn)API(這里你可以的到一些 SAX 的歷史信息)。即使這樣,SAX仍不是W3C 的REC。但毫無(wú)疑問(wèn)實(shí)際中它是行業(yè)內(nèi)解析XML文檔的標(biāo)準(zhǔn)。
  
  SAX 是一種基于事件的解析模式,是push-parsing原理,解析文檔的時(shí)候,當(dāng)遇到<opening> 標(biāo)簽, </closing>標(biāo)簽 或字符等,SAX 都會(huì)產(chǎn)生相應(yīng)的事件(event)。一個(gè)SAX解析器解析XML文檔的時(shí)候,把文檔看作為一個(gè)流,依次產(chǎn)生相應(yīng)的事件報(bào)告給已注冊(cè)的content handler, org.xml.sax.ContentHandler,如果有錯(cuò)誤,錯(cuò)誤會(huì)報(bào)告給error handler, org.xml.sax.ErrorHandler.
  
  如果你不注冊(cè)一個(gè)error handler,那你就根本不會(huì)知道在解析XML文檔的時(shí)候有沒(méi)有錯(cuò)誤產(chǎn)生和錯(cuò)誤是什么。因此,在SAX解析XML文檔的時(shí)候注冊(cè)一個(gè)error handler是極其重要的。
  
  如果程序需要知道有什么事件產(chǎn)生了(并且想處理此事件),那你必須實(shí)現(xiàn)org.xml.sax.ContentHandler 接口并注冊(cè)給 SAX解析器。一個(gè)典型的事件被觸發(fā)的順序是
  
  startDocument, startElement, characters, endElement, endDocument。
  
  startDocument 僅僅被觸發(fā)一次而且是在觸發(fā)其它event之前。同樣,endDocument僅僅被觸發(fā)一次而且是在整個(gè)文檔被成功解析之后。你可以從SAX javadocs中獲取更詳細(xì)的信息。
  

 
  Figure 2: SAX Parsing XML


  
  使用JAXP,通過(guò)SAX parse XML document的代碼片斷:
  
  SAXParserFactory spfactory = SAXParserFactory.newInstance();
  spfactory.setNamespaceAware(true);
  SAXParser saxparser = spfactory.newSAXParser();
  //write your handler for processing events and handling error
  DefaultHandler handler = new MyHandler();
  //parse the XML and report events and errors (if any) to the handler
  saxparser.parse(new File("data.xml"), handler);
  
  文檔對(duì)象模型解析
  
DOM 解析是基于對(duì)象的原理,當(dāng)用DOM解析XML文檔時(shí)它會(huì)在內(nèi)存中生成一個(gè)樹形的結(jié)構(gòu)來(lái)表示一個(gè)XML文檔。樹上的每個(gè)節(jié)點(diǎn)代表著XML文檔中的一個(gè)節(jié)點(diǎn)。 如果一個(gè)DOM解析器符合W3C標(biāo)準(zhǔn),那它產(chǎn)生的DOM就是W3C的DOM,使用org.w3c.dom APIs就能遍歷和修改這個(gè)DOM。
  
  大部分DOM解析器允許你抽取XML文檔里的一部分來(lái)生成DOM樹,而不是把整個(gè)XML文檔在內(nèi)存中建立對(duì)應(yīng)DOM樹。
  

 
  Figure 3: DOM Parsing XML


  
  使用JAXP, 通過(guò)DOM parse XML document的代碼片斷:
  
  DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
  dbfactory.setNamespaceAware(true);
  DocumentBuilder domparser = dbfactory.newDocumentBuilder();
  //parse the XML and create the DOM
  Document doc = domparser.parse(new File("data.xml"));
  //to create a new DOM from scratch -
  //Document doc = domparser.newDocument();
  //once you have the Document handle, then you can use
  //the org.w3c.dom.* APIs to traverse or modify the DOM...
  
  在校驗(yàn)?zāi)J较逻M(jìn)行解析
  
  根據(jù)DTD校驗(yàn)

  
DTD 是XML 文檔的語(yǔ)法。經(jīng)常人們會(huì)覺(jué)得DTD有點(diǎn)另類,因?yàn)樗蚗ML的syntax不一樣,但DTD是W3C XML1.0里的完整的一部分。如果一份XML文檔聲明了DOCTYPE,并且想在解析的時(shí)候根據(jù)DTD校驗(yàn)文檔,那你必須在適當(dāng)?shù)膄actory里啟用 根據(jù)DTD校驗(yàn)文檔(validation)這個(gè)特性。例如:
  
  DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
  dbfactory.setValidating(true);
  OR
  SAXParserFactory spfactory = SAXParserFactory.newInstance();
  spfactory.setValidating(true);
  
注意,如果XML文檔聲明了一個(gè)DTD ,即使你不啟用校驗(yàn)(validation)這個(gè)特性,解析器總是試著去讀入這個(gè)DTD?!∵@樣做的目的是為了保證XML文檔中entity reference被正確的擴(kuò)展了,否則會(huì)導(dǎo)致格式不正確的XML文檔,只有在XML文檔序言部分的聲明中standalone屬性被置為true時(shí),外 部的DTD才會(huì)被完全忽略掉。例如:
  
  <?xml version="1.1" encoding="UTF-8" standalone="yes"?>
  
  根據(jù)W3C Schema來(lái)校驗(yàn)XML文檔(WXS)
  
XMLSchema 是XML文檔的另外一種文法描述。XMLSchema非常流行市因?yàn)樗蚗ML文檔使用同樣的語(yǔ)法并且提供了豐富的定義校驗(yàn)限制的特性。如果一個(gè)XML文 檔用"schemaLocation" 和"noNamespaceSchemaLocation"指向了一個(gè)schema,結(jié)下來(lái)你想啟用根據(jù)XMLSchema校驗(yàn)文檔這個(gè)特性,你還要做如 下的步驟:
  
  1.和上面說(shuō)的一樣,調(diào)用SAXParserFactory o或DocumentBuilderFactory的setValidating函數(shù)來(lái)啟用validation這個(gè)特性。
  
  2.把屬性 "http://java./xml/jaxp/properties/schemaLanguage" 值設(shè)為 "http://www./2001/XMLSchema"
  
  注意,這種情況下,即使XML文檔有DOCTYPE聲明,處理器仍不會(huì)用DTD來(lái)校驗(yàn)這個(gè)文檔。但是和前面提到的一樣,為了任何一個(gè)entity reference是被正確擴(kuò)展的,這個(gè)DTD還是會(huì)被裝載的,
  
既然"schemaLocation" 和"noNamespaceSchemaLocation"僅僅是提示,所以可以使用屬性"http: //java./xml/jaxp/properties/schemaSource"從外部提供schemas來(lái)覆蓋這些提示。
  
  對(duì)于這個(gè)屬性,一些可以接受值是:
  
  ·是一個(gè)代表schema的URL地址的字符串。
  
  ·java.io.InputStream with the contents of the schema
  
  ·org.xml.sax.InputSource
  
  ·java.io.File
  
  ·一個(gè) java.lang.Object 的數(shù)組,數(shù)組內(nèi)容是上面所提到三類中的一個(gè)。
  
  例如:
  
  SAXParserFactory spfactory = SAXParserFactory.newInstance();
  spfactory.setNamespaceAware(true);
  //turn the validation on
  spfactory.setValidating(true);
  //set the validation to be against WXS
  saxparser.setProperty("http://java./xml/jaxp/properties/
  schemaLanguage", "http://www./2001/XMLSchema");
  //set the schema against which the validation is to be done
  saxparser.setProperty("http://java./xml/jaxp/properties/
  schemaSource", new File("myschema.xsd"));
  
  使用JAXP的TrAX APIs來(lái)進(jìn)行XML文檔轉(zhuǎn)換處理工作
  
  W3C XSL-T 定義了一些轉(zhuǎn)換規(guī)則來(lái)把源樹轉(zhuǎn)化生成結(jié)果樹。在XSL-T中,轉(zhuǎn)換信息所存在的文件叫樣式表(stylesheet)。要用JAXP來(lái)轉(zhuǎn)換一個(gè)XML文檔,你需

http://blog.csdn.net/haydenwang8287/archive/2007/09/13/1784396.aspx

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多