前言
由于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)