天天看点

更改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程序时,要在环境变量下包含工厂实现文件的绝对路径。