zoukankan      html  css  js  c++  java
  • xml

    单总结

     

    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规范
  • 相关阅读:
    P1439 【模板】最长公共子序列
    DP,入门???
    关于Eclipse在servlet中连接数据库时出现驱动加载失败的解决
    JSP学习(JavaBean)
    HTML随笔3
    CSS随笔3
    计算机网络随笔
    基本命令行操作1(java编译)
    Javascript随笔2(JQuery)
    Javascrip随笔1
  • 原文地址:https://www.cnblogs.com/z--z/p/8651674.html
Copyright © 2011-2022 走看看