posts - 8, comments - 13, trackbacks - 0, articles - 43
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          1。xml背景

          格式良好的(web-fromed)xml可以不需要文檔類型定義(DTD),只要滿足基本的xml格式規范就可以認為是格式良好的xml文檔。但是格式標準,只能說明元素、標簽、格式是合法的,并不能說明元素是有意義的,或者說規范的。

          有效的xml文檔,首先要求是格式良好的文檔,同時遵守相應的DTD文件約束。

          2。xml解析

          xml文檔解析的大致使用過程如下圖:

           

           

           

          由xml解析器解析和操作指定的xml文檔,然后提供接口供應用程序使用。如果解析器不同,那么提供的接口就有可能不同。慶幸的是,目前所有的xml解析器對兩套標準的api提供了支持,這兩套標準api就是dom和sax。

          dom:即document object model,文檔對象模型,它是w3c組織推薦的處理xml的標準接口。dom是基于xml文檔結構樹的解析。

          sax:即simple api for xml,它是非官方的、xml社區事實上的標準。sax是基于事件流的解析。

          dom和sax只是定義了一些接口以及某些接口的缺省實現,應用程序要想利用dom或sax訪問xml文檔,還需要真正實現dom或sax接口的xml解析器。apache的xerces是一個使用非常廣泛的解析器,它實現了dom和sax的調用接口,并提供了多種語言的實現版本。

          3。java語言對xml文檔的解析

          首先介紹jaxp:

          基于dom或sax提供的api接口,使用相應的解析器實現類我們已經可以對xml進行解析處理了。如下所示:

          org.xml.sax.XMLReader sp=new org.apache.xerces.parser.SAXParser();

          FileInputStream fis=new FileInputStream(“hello.xml”);

          InputSource is=new InputSource(fis);

          sp.setContentHandler(new MyConentHandler());

          sp.parse(is);

          為了屏蔽xml解析器的變化對代碼的影響,java提供了一套標準的處理xml文件的接口(實際上是一些抽象的工廠類),使得java開發人員以一種標準的方式對xml進行編程,即jaxp(java api for xml processing)。jaxp沒有提供解析xml的新方法,只是在解析器之上封裝一個抽象層。在jdk1.6的文檔中,我們可以看到javax.xml,org.w3c.dom,org.xml.sax包及其子包都屬于jaxp的部分。jaxp由接口、抽象類和一些輔助類組成,符合jaxp規范的解析器實現其中的接口和抽象類,開發時只需要使用jaxp的api編程,底層的解析器對開發者時透明的,可以隨意的切換。

          那么jaxp出現后,java應用程序處理xml文檔的過程就如下圖:

           

          那實際采用哪種解析器的jaxp實現,可以通過系統屬性、properties文件等方式來配置。

          下面具體介紹幾種java解析xml的方法:

          3.1 DOM方式(jaxp)

          在javax.xml.parsers包中,定義了dom的抽象工廠類DocumentBuilderFactory,在這個類中有一個靜態的方法newInstance(),通過它產生一個DocumentBuilderFactory的實例。前面提到過jaxp編程,解析器提供商必須繼承該抽象類產生一個具體的解析器工廠,然后由這個工廠類實例出一個解析器對象,再通過該解析器對象處理xml文檔。那么這個newInstance方法就是用來產生一個具體的解析器工廠類實例,查找生成解析器工廠類實例的方式可參考jdk文檔。

          在獲取到解析器工廠類實例類之后,就可以調用newDocumentBuilder()方法創建一個dom解析器實例;dom解析器實例就可以調用parser()方法獲取整個xml問答的Document對象。

          3 .2 SAX方式(jaxp)

          sax是基于事件驅動的api,sax解析xml文檔時會向事件處理器發送不同的事件。sax解析器接口和事件處理器接口都在org.xml.sax包中定義。XMLReader即為sax定義的解析器接口,由解析器提供商實現該借口,應用程序需要做的是編寫一個事件處理器。可以通過XMLReader的setContentHandler()方法來設置一個事件處理器的實例。

          與dom類似,jaxp也為sax解析器提供了抽象工廠類SAXParserFactory類,sax解析器工廠類的實例與dom解析器工廠類的實例類似,都是通過newInstance()方法來創建,不同的是SAXParserFactory的newInstance()方法查找的工廠類屬性是:javax.xml.parsers.SAXParserFactory。同樣,獲取sax解析器實例的方法,可以通過調用newSAXParser()。

          使用SAXParser和XMLReader都可以用來對xml文檔進行解析,前者只是對后者又一次的包裝。

          3.3 JDOM

          dom被設計用于完成幾乎所有的xml操作任務,同時又是與語言無關的,這就導致dom的api龐大而且復雜。為了使java程序員更方便地處理xml文檔,兩位國外的java技術專家創建了jdom。用developerworks上的一句話,“延續開源社群有需要就創建工具的歷史傳統,Java 技術專家 Jason Hunter 和 Brett McLaughlin 締造了 JDOM”。所以可以認為,jdom是一種專門用于java語言解析xml文檔的開放源代碼框架。

          jdom也使用對象樹來表示xml文檔,底層使用sax解析器分析xml文檔,形成jdom樹。

          3.4 DOM4J

          同jdom一樣,dom4j也是應用于java平臺,提供簡單、靈活的處理xml文檔的開發源代碼庫。很有意思的是,dom4j是由早期開發jdom的人分離出來而后獨立開發的,(利益或意見不和?呵呵)與jdom相比,dom4j提供了更好的靈活性。從網上的評論可以看出,dom4j從性能、功能、易用性上都優于jdom,可以作為解析xml文件的首選。(看來后來分離出的那撥人選擇還是正確的!)流行的hibernate,jaxm都采用了dom4j處理xml文件。

          dom4j也使用sax解析器來分析xml文檔,形成dom4j樹;它也提供了用于大文檔的基于事件的處理模型。

          所以可以看出,jdom和dom4j只是開源社區產生出來的方便地解析xml的框架或工具,并沒有創造新的xml解析方式。如果拿

          拿以上四種解析xml的方法比較,用孫鑫老師的話,如果你需要頻繁更換解析器就是jaxp方式,否則推薦使用dom4j。

          主站蜘蛛池模板: 武定县| 九龙坡区| 莆田市| 汽车| 都匀市| 赤峰市| 玛曲县| 汶上县| 乌拉特前旗| 大丰市| 安泽县| 志丹县| 当涂县| 江西省| 安西县| 武鸣县| 望奎县| 临武县| 迭部县| 沧州市| 金乡县| 景东| 唐山市| 丰顺县| 潢川县| 乐昌市| 龙门县| 万年县| 名山县| 云安县| 青河县| 高雄市| 台江县| 衡水市| 新疆| 禄丰县| 双峰县| 山西省| 兴城市| 山丹县| 海安县|