最初的xml解析器是sun的Crimson和IBM的Xerces,這兩個開源項目都捐給了apache組織,后來Xerces發(fā)展很快,Crimon基本沒有人使用。
1.4 版本起,用于 XML 處理的 Java API 就已經(jīng)加入了Java 2 平臺中。 利用該 API,可通過一系列標準的 Java 平臺 API 來處理 XML 文檔。
因此,也就無需另外添加 XML 處理包了。sun的JDK1.4使用Crimson,IBM的JDK使用Xerces。
如果打算把sun 的jdk程序移植到IBM的JDK下,注意解析器不同,XML處理會出問題。這就說明了java不是“一次編譯,到處運行”,而是“一次編譯,到處調(diào)試”。
如果你把IBM的JDK移植到SUN的JDK下,即使把Xerces包引入CLASSPATH,JDK還是使用Crimson,不信你運行java -verbose試一試。
解決的辦法就是在在JRE\lib\目錄下,建立一個jaxp.properties的文件,
內(nèi)容如下:
javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl
就可以使用Xerces。
或者使用命令行
# Add the XML parser jars and set the JAXP factory names
# Crimson parser JAXP setup(default)
CLASSPATH=$CLASSPATH:../lib/crimson.jar
JAXP=-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.crimson.jaxp.DocumentBuilderFactoryImpl
JAXP="$JAXP -Djavax.xml.parsers.SAXParserFactory=org.apache.crimson.jaxp.SAXParserFactoryImpl"
或
# Add the XML parser jars and set the JAXP factory names
# Xerces parser JAXP setup
CLASSPATH=$CLASSPATH:../lib/xerces.jar
JAXP=-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
JAXP="$JAXP -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl"
最終sun還是指定JAXP規(guī)范,JSR 206 Java API for XML Processing(JAXP) 1.3,他已經(jīng)由JDK1.5實現(xiàn)。
JAXP實現(xiàn)了XPath,但是xalan的org.apache.xpath.XPathAPI 類已經(jīng)移植到了 JRE 1.5 中,重構(gòu)為com.sun.org.apache.xpath.internal.XPathAPI。
如果在以前的JDK中,使用含 XPathAPI 類的 jar,例如 xalan-2.4.1.jar。 將該 jar 加入到 CLASSPATH(類路徑)。
W3C的DOM標準API非常難用,于是有人開發(fā) Java專用的XML API,這就是jdom=java+DOM。其中一部分人,去開發(fā)dom4j,這個不是非常標準,但是速度很快。
使用JDOM隱含服務器風險,因為JBoss和Webphere都是基于JDOM開發(fā)的,在這兩個服務器下使用JDOM,必須進行相應的設(shè)置,而且你的JDOM版本必須與服務器使用的相近,
因為JVM只加載一份相同的類,服務器優(yōu)先加載自己使用的JDOM,你開發(fā)用的JDOM不會被加載,你的應用就會出錯。
使用Dom4J隱含工程問題,主要是hibernate,如果你開發(fā)的項目和hibernate合并,Dom4J版本不兼容的話,尋找dom4j相同版本hibernate,或者你改程序適應hibernate的Dom4j。
java沒有windows的DLL地獄,但是java的jar地獄有過而無不及啊。