All about JAXP
http://www-128.ibm.com/developerworks/java/library/x-jaxp
Brett McLaughlin
?
Document Object Model (DOM)
Simple API for XML (SAX)
?
JDK1.4
javax.xml.parsers
javax.xml.transform
javax.xml.transform.dom
javax.xml.transform.sax
javax.xml.transform.stream
?
JDK5.0
javax.xml
javax.xml.datatype
javax.xml.namespace
javax.xml.parsers
javax.xml.transform
javax.xml.transform.dom
javax.xml.transform.sax
javax.xml.transform.stream
javax.xml.validation
javax.xml.xpath
?
?
嚴格來說,
JAXP
并沒有提供新的解析
XML
的方法,但是它使得我們更容易地使用
DOM
或者
SAX
來進行解析任務,更能以一種
vendor-neutral
的方式來使用
DOM
和
SAX
。
?
JAXP
與
SAX, DOM, JDOM
和
dom4j
(這四個都可以解析
XML
)沒有可比較性,它并沒有提供一個新的解析
XML
的方法。
?
JAXP API, located in the
javax.xml.parsers
package. All of these classes sit on top of an existing parser.
其中的
6
個類都是建立在已有的解析上面的。
?
JDOM
與
dom4j
都提供不同的模型來接受來自
SAX/DOM
的數據,他們從內部來講都是使用了
SAX
,不過是做了些修改。
?
此外,
Java 1.5
中
Xerces
的包
org.apache.xerces
被放到了
com.sun.org.apache.xerces.internal
?
First, com.sun.xml.tree.XMLDocument class is not part of JAXP. It is part of Sun's Crimson parser, packaged in earlier versions of JAXP.
?
Second, a major purpose of JAXP is to provide vendor independence when dealing with parsers. With JAXP, you can use the same code with Sun's XML parser, Apache's Xerces XML parser, and Oracle's XML parser.
?
先從
SAX
說起,我們只用繼承
DefaultHandler
類
(org.xml.sax.helpers
包中
)
就能獲得所有的
callbacks
,只用在需要的方法中加入實現的代碼。
?
Here's the typical SAX routine:
1
.
Create a SAXParser instance using a specific vendor's parser implementation.
2
.
Register callback implementations (by using a class that extends DefaultHandler, for example).
3
.
Start parsing and sit back as your callback implementations are fired off.
?
SAX
必須
指定
XML
驅動(如
org.apache.xerces.parsers.SAXParser
),而
JAXP
提供了更好的選擇,只要我們提供什么
XML
驅動(在
classpath
中配置),它就調用什么驅動,不需要改動代碼。
?
?
new SAXParserFactory.newSAXParser()
就返回
JAXP
SAXParser
類,這個類包裝了
SAX parser (an instance of the SAX class
org.xml.sax.XMLReader
)
。
?
In Listing 1, you can see that two JAXP-specific problems can occur in using the factory: the inability to obtain or configure a SAX factory, and the inability to configure a SAX parser.
The first of these problems, represented by a FactoryConfigurationError, usually occurs when the parser specified in a JAXP implementation or system property cannot be obtained.
The second problem, represented by a ParserConfigurationException, occurs when a requested feature is not available in the parser being used. Both are easy to deal with and shouldn't pose any difficulty when using JAXP.
?
SAXParser
的
parse
方法可以接受
SAX InputSource
,
Java InputStream
或者
URL in String form
?
可以通過
SAXParser
的
getXMLReader()
方法來獲得底層的
SAX parser
(
org.xml.sax.XMLReader
的實例),這樣就可以使用各個
SAXParser
方法。
[
參照
Listing2]
??
?
?
使用
DOM??
The only difference between DOM and SAX in this respect is that with DOM you substitute DocumentBuilderFactory for SAXParserFactory, and DocumentBuilder for SAXParser.
?
The major difference is that variations of the parse() method do not take an instance of the SAX DefaultHandler class. Instead they return a DOM Document instance representing the XML document that was parsed. The only other difference is that two methods are provided for SAX-like functionality:
-
setErrorHandler(), which takes a SAX ErrorHandler implementation to handle problems that might arise in parsing
-
setEntityResolver(), which takes a SAX EntityResolver implementation to handle entity resolution
1. Source for input
The
javax.xml.transform.Source
interface is the basis for all input into JAXP and the transformation API. This interface defines only two methods --
getSystemId()
and
setSystemId(String systemId)
.
?
?
JAXP
提供了三個實現
Source
接口的類:
-
javax.xml.transform.dom.DOMSource
passes a DOM
Node
(and its children) into JAXP.
-
javax.xml.transform.sax.SAXSource
passes the results of SAX callbacks (from an
XMLReader
) into JAXP.
-
javax.xml.transform.stream.StreamSource
passes XML wrapped in a
File
,
InputStream
, or
Reader
into JAXP.?
?
?
javax.xml.transform.Result
也有兩個方法:
getSystemId()
和
setSystemId(String systemId)
。
同樣有三個實現類:
-
javax.xml.transform.dom.DOMResult
passes transformed content into a DOM
Node
.
-
javax.xml.transform.sax.SAXResult
passes the results of a transformation to a SAX
ContentHandler
.
-
javax.xml.transform.stream.StreamResult
passes the transformed *ML into a
File
,
OutputStream
, or
Writer
.
3. Performing transformations with JAXP
2)Creating a Transformer?
?
3)Performing the transformation??
?
4)Caching XSL stylesheets
JAXP this way has two significant limitations:
-
The
Transformer
object processes the XSL stylesheet each and every time
transform()
is executed.
-
Instances of
Transformer
are not thread-safe. You can't use the same instances across multiple threads.
Transformer
實例不是線程安全的,不能通過多線程去使用同一個
Transformer
實例。
javax.xml.transform.Templates
.
?
The
Templates
interface is thread-safe (addressing the second limitation) and represents a compiled stylesheet (addressing the first limitation).
Templates
實例是線程安全的,可以處理一堆
XSL
,解決了上述兩個限制。
如果只要對一個
stylesheet
進行一個
transformation
,那么用
Transformer
比較快,沒有必要選擇
Templates
對象。但是考慮到線程安全問題,還是推薦使用
Templates
。
JAXP
默認使用
Xalan-J
,如果要使用其它
parser
,可以通過
javax.xml.transform.TransformerFactory
修改。
java -D javax.xml.transform.TransformerFactory=[transformer.impl.class] TestTransformations?
simple.xml simple.xsl
?
posted on 2006-09-08 13:15
Lizzie 閱讀(546)
評論(1) 編輯 收藏 所屬分類:
專業積木