天天看點

更改jdk的預設xml解析器

在指令行下運作java程式;

設定classpath=.;E:\normal\dev\j2ee\xml\xerces\xerces-2_9_1\xercesImpl.jar (或E:\normal\dev\j2ee\xml\xerces\xerces-2_9_1\xercesImpl.jar;.)

執行: javac  DOMStudentsInfo.java java  DOMStudentsInfo

無論是否存在jaxp.properties檔案都可運作,

jaxp.properties内容為: javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryIm pl javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl

運作結果為: E:\MyDoc\dev\Temp Pro\eclipse\lesson3\src>java DOMStudentsInfo JAXP: find factoryId =javax.xml.parsers.DocumentBuilderFactory JAXP: found jar resource=META-INF/services/javax.xml.parsers.Document uilderFactory using ClassLoader: [email protected] 1f JAXP: found in resource, value=org.apache.xerces.jaxp.DocumentBuilder actoryImpl JAXP: created new instance of class org.apache.xerces.jaxp.DocumentBu lderFactoryImpl using ClassLoader: [email protected] 821f DocumentBuilderFactory: org.apache.xerces.jaxp.DocumentBuilderFactory mpl DocumentBuilder: org.apache.xerces.jaxp.DocumentBuilderImpl Name: 張三 Age: 20 --------------- Name: 李四 Age: 21 ---------------

ps: 1. 修改環境變量後必需重新打開cmd視窗! 2.  DOMStudentsInfo.java 内容為:

import java.io.File; import java.io.IOException;

import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationExcep tion;

import org.w3c.dom.*; import org.xml.sax.SAXException;

public class DOMStudentsInfo {

public static void main(String[] args) { System.setProperty("jaxp.debug","TRUE"); DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); System.out.println("DocumentBuilderFactory: "+dbf.getClass().getName()); try { DocumentBuilder db =dbf.newDocumentBuilder(); System.out.println("DocumentBuilder: "+db.getClass().getName()); Document doc =db.parse(new File("Students.xml")); NodeList nl =doc.getElementsByTagName_r("student"); int len =nl.getLength(); for(int i=0;i<len;i++) {      Element ele =(Element) nl.item(i);      Node ndName =ele.getElementsByTagName_r("name").item(0);      Node ndAge =ele.getElementsByTagName_r("age").item(0);           String strName =ndName.getFirstChild().getNodue();      String strAge =ndAge.getFirstChild().getNodue();           System.out.println("Name: "+strName);      System.out.println("Age: "+strAge);      System.out.println("---------------"); } } catch (ParserConfigurationExcep tion e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) {      // TODO Auto-generated catch block      e.printStackTrace(); } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace(); } }

}

3.然而在eclipse3.5.1下,不管是否正存在jaxp.properties以及是否設定了classpath=E:\normal\dev\j2ee\xml\xerces\xerces-2_9_1\xercesImpl.jar;. eclipse運作結果都為:

JAXP: find factoryId =javax.xml.parsers.DocumentBuilderFactory JAXP: loaded from fallback value: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryIm pl JAXP: created new instance of class com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryIm pl using ClassLoader: null DocumentBuilderFactory: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryIm pl DocumentBuilder: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl Name: 張三 Age: 20 --------------- Name: 李四 Age: 21 ---------------

但是,當eclipse導入了xercesImpl.jar,則總是輸出:

JAXP: find factoryId =javax.xml.parsers.DocumentBuilderFactory JAXP: found jar resource=META-INF/services/javax.xml.parsers.DocumentBuilderFactory using ClassLoader: [email protected] JAXP: found in resource, value=org.apache.xerces.jaxp.DocumentBuilderFactoryIm pl JAXP: created new instance of class org.apache.xerces.jaxp.DocumentBuilderFactoryIm pl using ClassLoader: [email protected] DocumentBuilderFactory: org.apache.xerces.jaxp.DocumentBuilderFactoryIm pl DocumentBuilder: org.apache.xerces.jaxp.DocumentBuilderImpl Name: 張三 Age: 20 --------------- Name: 李四 Age: 21 ---------------

----------------------------------------------------- 總結: 1. 使用eclipse時若需替換jdk預設的xml解析器,則中需要導入相應的工廠實作。 2. 使用指令行執行java程式時,要在環境變量下包含工廠實作檔案的絕對路徑。