`
刘琛颖
  • 浏览: 50001 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用JAXP API

    博客分类:
  • XML
阅读更多

为了让我们的应用程序不依赖于具体的解析器,让我们以统一的接口来访问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解析器实例

Java 代码
  1. package test;  
  2. import java.io.*;  
  3. import javax.xml.parsers.*;  
  4. import org.w3c.dom.Document;  
  5. public class JAXPTest {  
  6.     public static void main(String[] args) {  
  7.         try {  
  8.             DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  9.             DocumentBuilder builder = factory.newDocumentBuilder();  
  10.             Document document = builder.parse(new FileInputStream("my.xml"));  
  11.         } catch (Exception e) {  
  12.             e.printStackTrace();  
  13.         }  
  14.     }  
  15. }  
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

    Apache ServiceMix Specs :: JAXP API 1.3

    jaxp的四个jar包

    JAXP-api.jar则提供了统一的接口,使得开发者可以选择使用SAX或DOM,甚至进行XSLT转换。在实际开发中,根据项目需求和性能考虑,可以选择合适的XML处理方式。例如,如果需要对XML进行复杂的查询和转换,DOM可能更...

    JAXP 专述――Sun 的 Java API for XML 语法分析

    《深入解析JAXP:Sun的Java API for XML解析》 在探讨JAXP(Java API for XML Processing)这一主题时,我们需首先明确其在Java与XML领域中的定位与价值。JAXP并非旨在革新XML处理的方式,也不提供额外的语法分析...

    使用JAXP之SAX读取XML内容

    JAXP(Java API for XML Processing)是Java平台上的XML处理标准,它提供了包括SAX在内的三种解析方式,即DOM(Document Object Model)、SAX和XSLT。本篇文章将深入探讨如何使用JAXP的SAX解析器来读取XML内容。 ...

    java生成Xml文件

    在使用Java标准库中的XML API(如JAXP)来生成XML文件时,默认情况下,生成的XML文件是没有缩进的,这使得文件难以阅读。因此,掌握如何控制XML文件的缩进格式变得尤为重要。 #### 二、基础知识 在深入探讨之前,...

    JAXP 专述

    JAXP不提供新的XML处理方式,而是对SAX(Simple API for XML)和DOM(Document Object Model)这两个流行的XML解析API进行了封装,使得它们的使用更加方便和统一。 **JAXP的基本概念** 1. **API与抽象层的区别** ...

    jing-jaxp-test

    本项目"jing-jaxp-test"专注于使用JAXP API和Jing工具来验证XML文件的正确性,特别关注了带有名称空间的XML文件。 JAXP提供了三种解析器类型:SAX(Simple API for XML)、DOM(Document Object Model)和XPath。在...

    超全面javaweb第4天- 21 jaxp的api的查看

    超全面javaweb第4天-_21_jaxp的api的查看

    使用JAXP处理XML文件.pdf

    ### 使用JAXP处理XML文件的关键知识点 #### JAXP简介 JAXP(Java API for XML Processing)是Java平台中处理XML文档的标准API之一。它主要包括两大块:DOM(Document Object Model)和SAX(Simple API for XML)。...

    基于AjaxP的通用查询

    1. **创建Ajax请求**:使用JavaScript的`XMLHttpRequest`对象或现代浏览器提供的`fetch` API,创建一个到服务器的HTTP请求。 2. **发送请求**:将查询参数附加到请求中,然后发送请求。可以是GET或POST方式,取决于...

    XML的Jaxp解析示例和简单项目

    本文将深入探讨XML的解析方式之一——JAXP(Java API for XML Processing),并提供一个简单的JAXP解析XML项目的概述。 ### JAXP简介 JAXP是Java平台上的标准API,它提供了处理XML的两种主要方法:解析和转换。在...

    基于Java的JAXP数据验证引擎 Serene.zip

    Java的JAXP(Java API for XML Processing)是Java平台上的一个标准接口,用于处理XML文档,包括解析、查询和转换。在这个名为“基于Java的JAXP数据验证引擎 Serene.zip”的压缩包中,我们可以推测它包含了一个使用...

    使用jaxp进行dom解析_动力节点Java学院整理

    本文将详细介绍如何使用Java中的JAXP(Java API for XML Processing)来实现DOM解析,帮助开发者快速理解和掌握DOM解析技术。 首先,我们来了解一下JAXP。JAXP是Java提供的用于处理XML文档的一组API,主要包含两个...

    Sun 的 Java API for XML 语法分析

    使用JAXP的正确做法是避免直接依赖解析器的实现细节,而是通过JAXP的API来操作XML,以保持代码的可移植性和灵活性。 总的来说,JAXP是Java平台上的一个重要工具,它简化了XML处理,促进了XML解析器之间的互操作性,...

    J2ee API中文文档

    7. **其他API**:J2EE还包含了其他的API,如JAF(JavaBeans Activation Framework)用于处理MIME类型的对象,JCA(Java Connector Architecture)用于与非Java系统集成,JAXP(Java API for XML Processing)和JAXB...

    XML_JAVA指南.rar_WORKING_java Tutorial_java xml_jaxp_xml

    在Java中,处理XML文档时,Java API for XML Parsing(JAXP)是一个核心工具集,它提供了在Java环境中解析XML的接口和类。 **XML的基本概念** XML文档由元素、属性、文本和注释组成。元素是XML文档的基本构建块,...

    JAXP数据验证引擎 Serene

    Java API for XML Processing (JAXP) 是Java平台上的标准XML处理接口,它提供了处理XML文档的能力,包括解析、转换和验证。其中,JAXP的数据验证引擎是用于确保XML文档符合特定XML Schema(XSD)或DTD(文档类型定义...

    JAXP数据验证引擎 Serene.7z

    Java XML Processing (JAXP) 是Java平台上的一个标准API,用于处理XML文档。它提供了对XML解析、XPath表达式处理以及XSLT转换的支持。在这个"JAXP数据验证引擎 Serene.7z"压缩包中,我们关注的是数据验证引擎Serene...

Global site tag (gtag.js) - Google Analytics