前言
由於XML技術的快速發展及各企業相繼使用XML做為資料儲存的架構基礎,為此Java 程式語言的發展廠商Sun Microsystems Inc.(美國昇陽科技)發展了可以讓程式開發工程師使用Java語言來處理以XML格式儲存資料的應用程式開發套件Java API for XML Parsing(JAXP)。
在這個章節中,我們將針對 Sun Microsystems Inc.所開發的Java API for XML Parsing (JAXP) 結構做介紹。
Java API for XML Parsing(JAXP)APIs
Java API for XML Parsing(JAXP)為Sun Microsystems Inc.(美國昇陽科技)所推出的一個應用程式界面套件,它提供了Java APIs讀取、控制運用及產生XM文件的功能並且讓Java程式能與任何一種XML-compliant 解析器完全整合。
在Sun Microsystems Inc.所提供的Java API for XML Parsing (JAXP)程式開發套件中,JAXP 包含在jaxp.jar 的檔案裡。因此,當我們需要用到JAXP的應用程式界面 (API)時,我們必須要在Java程式中加入「import javax.xml.parsers.」,指引編譯器到javax.xml.parsers 的位址找尋我們所需的應用程式界面。
在javax.xml.parsers的套件中,您會發現裡面包含了兩個factory API classes SAXParserFactory、 DocumentBuilderFactory 以及一個 DocumentBuilder API。
SAXParserFactory:為用來定義一個應用程式介面,讓Java程式能夠取得一個SAX (Simple API for XML)剖析器元件來編譯XML文件。
DocumentBuilderFactory:取得一個剖析器,用來產生DOM (Document Object Mode)樹狀形態物件。
DocumentBuilder:定義一個應用程式介面(API)用來產生DOM物件。
SAXParserFactory及DocumentBuilderFactory這兩個factory APIs允許程式開發工程師在所開發的Java程式中直接插入使用其他廠商所提供的XML Implementation,而不須更改原始程式,省去了許多麻煩及減少了程式開發時間。
SAX及DOM概論
SAX(表一)以及DOM APIs是由XML-DEV group和W3C (World Wide Web Consortium)所分別訂定的應用程式介面標準。所有關於SAX及DOM APIs的函式庫(Libraries)都包括在Sun Microsystems Inc.的Java API for XML Parsing (JAXP)程式開發套件的parser.jar檔案中。
Simple API for XML (SAX)在XM文件被解析時提供一個event-driven的界面,用來做為XML解析時應用程式的「callback」通告。
SAX 2.0 API的相關文件可參考http://www.megginson.com/SAX/index.html。
DOM API為目前最容易使用的界面。DOM API以讓人一目瞭然的樹狀形態來顯示物件。使用者並可利用DOM API來控制所包含的物件,以達到與使用者互動的目的。
DOM API的相關文件可參考http://www.w3.org/TR/REC-DOM-Level-1/
在SAX與DOM APIs的比較之下, 由於DOM會先取讀完整的XML結構並以樹狀形態儲存物件於記憶體中,所以需要耗用比SAX 更多的 CPU效能及記憶體。因此在伺服器主機端 (Server side),建議最好是使用SAX API以免伺服器的整體效能被減低。
SAX APIs
SAX API的結構圖如(圖一)。上端的SAXParserFactory 為 SAX 解析器產生實體。 XML 文件由SAX Parser的左方輸入,經過SAX Parser解析後,解析器將依照文件需求呼叫由Document Handler、Error Handler、DTD Handler及Entity Resolver界面所訂定的callback method。
下面為SAX API主要元件的概要:
SAXParserFactory:javax.xml.parsers.SAXParserFactory主要為用來產生SAX解析器。
Parser:org.xml.sax.Parser界面負責訂定methods(例如: setDocumentHandler)及解析器 (URL)來解析文件。這個界面是由com.sun.xml.parser套件中的Parser以及 ValidatingParser classes來呼叫執行。
DocumentHandler:當XML tag經過驗證後,startDocument、endDocument、startElement、 及endElement methods將會被呼叫。這個界面並且定義characters及 processingInstruction methods。當解析器在XML element 中讀到文字(text) 或inline processing指令時,characters 或processingInstruction method 將會被呼叫。
ErrorHandler:如果在解析時發生錯誤,error、fatalError或 warning method將會被呼叫。 預設的 error handler 將會 throws 一個 exception 給 fatal errors 並且忽略其他的errors(其中包含了validation errors)。所以,如果您想要正確的handle error,您就要必須提供自己的error handler給解析器。
DTDHandler:這一個界面是由com.sun.java.xml的DtdEventListener所延伸出來的。這個界面所訂定的method 在 DTD資訊處理時會被呼叫。
EntityResolver:當解析器須要透過URI確認外部資料時,resolveEntity method則會被呼叫。在大部份的情況下,URI可以使用一般的URL來指定一個文件的位置,但是在某一些特殊情況下,文件的位置就必須要使用URN來表示。如果 URN 被使用,EntityResolver將使用URN替代URL來找尋所在位置文件。
SAX APIs 並且訂定了一些其他界面讓使用者在開發 SAX 應用程式時能夠使用, 其中並包含了一些有用的工具套件(Utility Package)。(表二)、(表三)為這些界面及套件的介紹:
《表三 工具套件 {com.sun.xml.util}》 |
|
Document Object Model (DOM) APIs
如(圖二),我們使用左上方的javax.xml.parsers.DocumentBuilderFactory class 來取得 DocumentBuilder的實體,然後使用DocumentBuilder的實體依據DOM的規範來產生圖中右下方的DOM 文件。
我們可以使用 builder 的 newDocument method來產生一個空的文件來implement org.w3c.dom.Document 的介面。 或者,我們也可以使用 builder 的任何一個剖析 methods 來從現存的 XML 資料中產生出一份文件,結果就如同圖二右下方的 DOM 樹狀結構。
Document Object Model implement 定義在(表四)的套件中。
《表四 Document Object Model implement 套件敘述》 |
|
結論
由於XML 的快速興起,各資訊軟體企業紛紛推出能夠接受及處理 XML 格式資料的產品。 對於使用 Sun Java SDK來開發程式的使用者, Sun Microsystems Inc. 所提供的 Java API for XML Parsing (JAXP) 界面讓程式開發者能夠容易及快速的開發 XML 應用軟體程式來存取及處理以 XML 格式儲存的資料。
(作者為安際公司XML科技中心軟體工程師,如對本文有任何疑問,歡迎來信洽詢:xml@anjes.com.tw)