您的位置:首页 > 编程语言 > Java开发

更改jdk的默认xml解析器

2016-02-09 02:47 375 查看
在命令行下运行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.DocumentBuilderFactoryImpl
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: sun.misc.Launcher$AppClassLoader@198
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: sun.misc.Launcher$AppClassLoader@1
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.ParserConfigurationException;

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 (ParserConfigurationException 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.DocumentBuilderFactoryImpl
JAXP: created new instance of class com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl using ClassLoader: null
DocumentBuilderFactory: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
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: sun.misc.Launcher$AppClassLoader@19821f
JAXP: found in resource, value=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
JAXP: created new instance of class org.apache.xerces.jaxp.DocumentBuilderFactoryImpl using ClassLoader: sun.misc.Launcher$AppClassLoader@19821f
DocumentBuilderFactory: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
DocumentBuilder: org.apache.xerces.jaxp.DocumentBuilderImpl
Name: 张三
Age: 20
---------------
Name: 李四
Age: 21
---------------

-----------------------------------------------------
总结:
1. 使用eclipse时若需替换jdk默认的xml解析器,则中需要导入相应的工厂实现。
2. 使用命令行执行java程序时,要在环境变量下包含工厂实现文件的绝对路径。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: