java xml技术简单总结

| Comments

XML概述

  • XML,就是可扩展标记语言Extensible Markup Language,包括XML/DTD/XSD/XPATH的w3c规范,在webservice方面主要应用有SOAP/WSDL等(WSDL还不是w3c规范)
  • JAVA规范API统称JAXP,主要有DOM/SAX/STAX/XPATH等标准API,并内置默认实现。并在JAXP的基础上建立了JAXB/JAX-WS等规范
  • 常见的JAXP API(解析器)实现有xerces/crimson/woodstox/xalan等开源实现,也有一些厂商的实现(如IBM)。常用的XML操作库如dom4j/jdom是JAXP API的二次封装(其实也封装了其他一些非规范的实现)
  • 常见的webservice库如axis2/xfire/cxf等,按自己的方式实现了SOAP/WSDL等功能(XML相关功能基于JAXP),由于JAX-WS规范的兴起,这些库也实现了JAX-WS规范
  • 运行期实现类的查找模式都是类似,基本都是参数、配置、SPI、默认实现的顺序。如果有需要(如存在bug/性能问题),可以根据这个查找顺序更换不同的实现方式。

XML标准

  • 平时常用的有校验和查找相关的标准
  • 校验方面主要是DTD(Document Type Definition),后来的XSD(XML Schema Define)则支持更好
  • 查找方面除了通用的DOM模型,常见的就是XPATH了,而不是很常见的XQUERY和XPOINTER是建立在XPATH基础上的

XML常见应用

  • SOAP Simple Object Access Protocol的首字母缩写,即简单对象访问协议
  • WSDL 网络服务描述语言,Web Services Description Language
  • UDDI
  • RSS Rich Site Summary 简易资讯聚合
  • WAP无线应用协议(Wireless Application Protocol,WAP)

Java XML相关的API规范

  • JAXP(Java API for XMLProcessing),定义了处理XML的通用接口,常见的包括DOM/SAX/STAX/XPATH等标准API
  • JAXB(Java Architecture for XML Binding),基于JAXP,定义了XML和Java对象的映射处理关系
  • JAX-WS,基于JAXP/JAXB,定义了一套XML webservice的标准接口

上面只是定义了规范,就是标准接口,具体的实现通常是不需要关心的。
下面再介绍一下,在运行期是如何确定采用哪种具体实现的,在定位某些问题的时候有帮助。
以oracle jdk为例,其他jdk实现基本是差不多的,主要是默认实现有所差异。

DOM

  • 首先,有没有系统参数javax.xml.parsers.DocumentBuilderFactory
  • 如果没有找到,就检查JRE/lib/jaxp.properties是否有配置该参数
  • 如果没有找到,就通过SPI机制查找有没有实现: META-INF/services/javax.xml.parsers.DocumentBuilderFactory
  • 如果没有找到,选择默认xerces实现(oracle JDK):com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

SAX

  • 首先,有没有系统参数javax.xml.parsers.SAXParserFactory
  • 如果没有找到,就检查JRE/lib/jaxp.properties是否有配置该参数
  • 如果没有找到,就通过SPI机制查找有没有实现: META-INF/services/javax.xml.parsers.SAXParserFactory
  • 如果没有找到,选择默认xerces实现(oracle JDK):com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl

STAX

  • 和上面有点不同,它是区分输入输出的:javax.xml.stream.XMLInputFactory、javax.xml.stream.XMLOutputFactory
  • 首先,有没有系统参数javax.xml.stream.XMLInputFactory、javax.xml.stream.XMLOutputFactory
  • 如果没有找到,就检查JRE/lib/stax.properties、jaxp.properties是否有配置该参数
  • 如果没有找到,就通过SPI机制查找有没有实现: META-INF/services/javax.xml.stream.XMLInputFactory、javax.xml.stream.XMLOutputFactory
  • 如果没有找到,选择默认内部实现(oracle JDK):com.sun.xml.internal.stream.XMLInputFactoryImpl、com.sun.xml.internal.stream.XMLOutputFactoryImpl

XPATH

  • 首先,有没有系统参数javax.xml.xpath.XPathFactory:http://java.sun.com/jaxp/xpath/dom,注意这个是有点特别的
  • 如果没有找到,就检查JRE/lib/jaxp.properties查找javax.xml.xpath.XPathFactory是否有配置该参数
  • 如果没有找到,就通过SPI机制查找有没有实现: META-INF/services/javax.xml.xpath.XPathFactory
  • 如果没有找到,选择默认xalan实现(oracle JDK):com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl

JAXB

  • 首先,检查配置文件jaxb.properties有没有定义javax.xml.bind.context.factory工厂类,通过createContext生成
  • 如果没有找到,就通过SPI机制查找有没有实现: META-INF/services/javax.xml.ws.spi.Provider
  • 如果没有找到,选择默认内部实现(oracle JDK):com.sun.xml.internal.bind.v2.ContextFactory

JAX-WS

  • 首先,通过SPI机制查找有没有实现: META-INF/services/javax.xml.ws.spi.Provider
  • 如果没有找到,选择默认内部实现(oracle JDK):com.sun.xml.internal.ws.spi.ProviderImpl

第三方库实现

  • 开源的解析器(xerces, crimson, woodstox, xalan)主要是实现JAXP中的规范API
  • 还有一些专业厂商的实现,例如IBM的JAXP实现(XL XP-J, XML4J),在websphere的plugins目录就可以找到
  • 非JAXP的实现,如xpp3也实现了类似STAX的pull模式,在android sdk中内置
  • 二次封装库(dom4j, jdom),主要是包装了JAXP,提供统一处理模型(DOM/SAX/STAX等)和简易的用法
  • WebService(Axis,Axis2,XFire,CXF(XFire升级版)),实现基于SOAP的Web服务,有些库也实现JAX-WS规范

Comments