为了让我们的应用程序不依赖于具体的解析器,让我们以统一的接口来访问XML文档,Sun公司开发了JAXP(Java API For XML Processing)API。
JAXP没有扩充解析器新的功能,它是对解析器的一个封装,使开发人员能够独立于具体的解析器,这样我们就可以在应用程序中任意更换解析器,而不用更改应用程序代码。现在主流的解析器都支持DOM和SAX,所以JAXP也都支持。JAXP现在的版本是 1.3包含在JDK5.0之中。
javax.xml包及子包,org.w3c.dom包及子包,org.xml.sax包及子包。javax.xml包及子包主要是获取解析器的实例,获取到解析器实例后就可以对XML进行读取,如果我们使用DOM解析,那么就使用org.w3c.dom包及子包中的接口或者类,反之使用 org.xml.sax包及子包中的接口或者类。那怎么通过JAXP获取解析器实例呢?
在javax.xml.parsers这个包中提供了四个类DocumentBuilder、DocumentBuilderFactory、 SAXParser、SAXParserFactory 前两个是获取DOM解析器实例的,后两个是获取SAX解析器实例的。
一、获取DOM解析器实例
- package test;
- import java.io.*;
- import javax.xml.parsers.*;
- import org.w3c.dom.Document;
- public class JAXPTest {
- public static void main(String[] args) {
- try {
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- DocumentBuilder builder = factory.newDocumentBuilder();
- Document document = builder.parse(new FileInputStream("my.xml"));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
package test;
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.Document;
public class JAXPTest {
public static void main(String[] args) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new FileInputStream("my.xml"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上代码的document对象就是XML文档树,XML文档的数据就在此对象中。
二、更改解析器
更改 JAXP 工厂类使用的解析器很容易。更改解析器实际上意味着更改解析器工厂,因为所有 SAXParser 和 DocumentBuilder 实例都来自这些工厂。工厂确定加载哪个解析器,所以必须更改工厂。要更改 SAXParserFactory 接口的实现,请设置 Java 系统特性 javax.xml.parsers.SAXParserFactory。如果未定义此特性,则返回默认实现(不管开发商指定哪个解析器)。同一规则适用于所使用的 DocumentBuilderFactory 实现。在这种情况下,将会查询 javax.xml.parsers.DocumentBuilderFactory 系统特性。
三、JAXP API怎样加载解析器
1、使用系统属性
如果我们在调用DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();代码前设置了系统属性,如下:
System.setProperty("javax.xml.parsers.DocumentBuilderFactory","org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
那么JAXP就会使用你提供的解析器。设置系统属性还可以使用另外一种方式,运行该类的时候使用-D参数,如:java -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl coresun.cn.JAXPTest
2、在JAVA_HOME\JRE\lib文件夹下建立jaxp.properties 文件,在文件中添加如下内容:
javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
3、查找解析器jar文件的META-INF\services目录
在此目录下如果含有javax.xml.parsers.DocumentBuilderFactory文件,则通过此文件的内容加载解析器。
4、如果前三种方式都没有找到解析器,JAXB使用缺省的解析器Apache Xerces(JAXP 1.1 捆绑了Apache Crimson)。
下面是一篇关于JAXP有趣的文章《XML api折射出sun与IBM的恩仇》,可供参考一下,原文地址: http://www.w3china.org/blog/more.asp?name=hongrui&id=23698
引用
最初的xml解析器是sun的Crimson和IBM的Xerces,这两个开源项目都捐给了apache组织,后来Xerces发展很快,Crimon基本没有人使用。
1.4 版本起,用于 XML 处理的 Java API 就已经加入了Java 2 平台中。 利用该 API,可通过一系列标准的 Java 平台 API 来处理 XML 文档。
因此,也就无需另外添加 XML 处理包了。sun的JDK1.4使用Crimson,IBM的JDK使用Xerces。
如果打算把sun 的jdk程序移植到IBM的JDK下,注意解析器不同,XML处理会出问题。这就说明了java不是“一次编译,到处运行”,而是“一次编译,到处调试”。
如果你把IBM的JDK移植到SUN的JDK下,即使把Xerces包引入CLASSPATH,JDK还是使用Crimson,不信你运行 java -verbose试一试。
解决的办法就是在在JRE\lib\目录下,建立一个jaxp.properties 的文件,
内容如下:
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规范,JSR 206 Java API for XML Processing(JAXP) 1.3,他已经由JDK1.5实现。
JAXP实现了XPath,但是xalan的 org.apache.xpath.XPathAPI 类已经移植到了 JRE 1.5 中,重构为com.sun.org.apache.xpath.internal.XPathAPI。
如果在以前的JDK中,使用含 XPathAPI 类的 jar,例如 xalan-2.4.1.jar。 将该 jar 加入到 CLASSPATH(类路径)。
W3C的DOM标准API非常难用,于是有人开发 Java专用的XML API,这就是jdom=java+DOM。其中一部分人,去开发dom4j,这个不是非常标准,但是速度很快。
使用JDOM隐含服务器风险,因为JBoss和Webphere都是基于JDOM开发的,在这两个服务器下使用JDOM,必须进行相应的设置,而且你的JDOM版本必须与服务器使用的相近,
因为JVM只加载一份相同的类,服务器优先加载自己使用的JDOM,你开发用的JDOM不会被加载,你的应用就会出错。
使用Dom4J隐含工程问题,主要是hibernate,如果你开发的项目和hibernate合并,Dom4J版本不兼容的话,寻找dom4j 相同版本hibernate,或者你改程序适应hibernate的Dom4j。
java没有windows的DLL地狱,但是java的jar地狱有过而无不及啊。
分享到:
相关推荐
Apache ServiceMix Specs :: JAXP API 1.3
JAXP-api.jar则提供了统一的接口,使得开发者可以选择使用SAX或DOM,甚至进行XSLT转换。在实际开发中,根据项目需求和性能考虑,可以选择合适的XML处理方式。例如,如果需要对XML进行复杂的查询和转换,DOM可能更...
《深入解析JAXP:Sun的Java API for XML解析》 在探讨JAXP(Java API for XML Processing)这一主题时,我们需首先明确其在Java与XML领域中的定位与价值。JAXP并非旨在革新XML处理的方式,也不提供额外的语法分析...
JAXP(Java API for XML Processing)是Java平台上的XML处理标准,它提供了包括SAX在内的三种解析方式,即DOM(Document Object Model)、SAX和XSLT。本篇文章将深入探讨如何使用JAXP的SAX解析器来读取XML内容。 ...
在使用Java标准库中的XML API(如JAXP)来生成XML文件时,默认情况下,生成的XML文件是没有缩进的,这使得文件难以阅读。因此,掌握如何控制XML文件的缩进格式变得尤为重要。 #### 二、基础知识 在深入探讨之前,...
JAXP不提供新的XML处理方式,而是对SAX(Simple API for XML)和DOM(Document Object Model)这两个流行的XML解析API进行了封装,使得它们的使用更加方便和统一。 **JAXP的基本概念** 1. **API与抽象层的区别** ...
本项目"jing-jaxp-test"专注于使用JAXP API和Jing工具来验证XML文件的正确性,特别关注了带有名称空间的XML文件。 JAXP提供了三种解析器类型:SAX(Simple API for XML)、DOM(Document Object Model)和XPath。在...
超全面javaweb第4天-_21_jaxp的api的查看
### 使用JAXP处理XML文件的关键知识点 #### JAXP简介 JAXP(Java API for XML Processing)是Java平台中处理XML文档的标准API之一。它主要包括两大块:DOM(Document Object Model)和SAX(Simple API for XML)。...
1. **创建Ajax请求**:使用JavaScript的`XMLHttpRequest`对象或现代浏览器提供的`fetch` API,创建一个到服务器的HTTP请求。 2. **发送请求**:将查询参数附加到请求中,然后发送请求。可以是GET或POST方式,取决于...
本文将深入探讨XML的解析方式之一——JAXP(Java API for XML Processing),并提供一个简单的JAXP解析XML项目的概述。 ### JAXP简介 JAXP是Java平台上的标准API,它提供了处理XML的两种主要方法:解析和转换。在...
Java的JAXP(Java API for XML Processing)是Java平台上的一个标准接口,用于处理XML文档,包括解析、查询和转换。在这个名为“基于Java的JAXP数据验证引擎 Serene.zip”的压缩包中,我们可以推测它包含了一个使用...
本文将详细介绍如何使用Java中的JAXP(Java API for XML Processing)来实现DOM解析,帮助开发者快速理解和掌握DOM解析技术。 首先,我们来了解一下JAXP。JAXP是Java提供的用于处理XML文档的一组API,主要包含两个...
使用JAXP的正确做法是避免直接依赖解析器的实现细节,而是通过JAXP的API来操作XML,以保持代码的可移植性和灵活性。 总的来说,JAXP是Java平台上的一个重要工具,它简化了XML处理,促进了XML解析器之间的互操作性,...
7. **其他API**:J2EE还包含了其他的API,如JAF(JavaBeans Activation Framework)用于处理MIME类型的对象,JCA(Java Connector Architecture)用于与非Java系统集成,JAXP(Java API for XML Processing)和JAXB...
在Java中,处理XML文档时,Java API for XML Parsing(JAXP)是一个核心工具集,它提供了在Java环境中解析XML的接口和类。 **XML的基本概念** XML文档由元素、属性、文本和注释组成。元素是XML文档的基本构建块,...
Java API for XML Processing (JAXP) 是Java平台上的标准XML处理接口,它提供了处理XML文档的能力,包括解析、转换和验证。其中,JAXP的数据验证引擎是用于确保XML文档符合特定XML Schema(XSD)或DTD(文档类型定义...
Java XML Processing (JAXP) 是Java平台上的一个标准API,用于处理XML文档。它提供了对XML解析、XPath表达式处理以及XSLT转换的支持。在这个"JAXP数据验证引擎 Serene.7z"压缩包中,我们关注的是数据验证引擎Serene...