WEB开发网
开发学院WEB开发Jsp Java API for XML Parsing(JAXP)演进 阅读

Java API for XML Parsing(JAXP)演进

 2008-01-05 19:21:56 来源:WEB开发网   
核心提示:简介在1998年W3Cxml1.0推荐标准发布之后,XML就开始变得很流行,Java API for XML Parsing(JAXP)演进,Sun公司就是在那时候规范java Community PRocess (JCP),同时JAXP(JSR-05)的第一版在2000早些时候发布了,这个版本得到了很多工业集团的支持

  简介
  
  在1998年W3Cxml1.0推荐标准发布之后,XML就开始变得很流行。Sun公司就是在那时候规范java Community PRocess (JCP),同时JAXP(JSR-05)的第一版在2000早些时候发布了。这个版本得到了很多工业集团的支持,譬如(以年月次序排列)BEA Systems, Fujitsu Limited, Hewlett-Packard, IBM, Netscape Communications, Oracle, and Sun Microsystems, Inc.
  
  JAXP (全称Java API for XML Parsing)的可插拔性(pluggability)在开发社区里引起很大的轰动。这点也是JAXP的精华所在。开发人员可以编写自己的xml处理器,只要它符合JAXP的APIs,这样底层不同的xml处理器可以任意切换而不用改应用程序的代码。
  
  那JAXP到底是什么呢?首先 这个P有点迷惑,它代表Parsing还是Processing呢?
  
  因为JAXP1.0的时候只支持解析(parsing),所以JAXP全称应该是Java API for XML Parsing.
  
  但在JAXP1.1的时候,XSL-T被推荐用作XML的转换(transformation)处理。很遗憾,当时W3C XLT-T的标准规范(specification)里没有提供任何用来转换(transformation)处理的APIs。因此JAXP1.1的专家组推荐了一组APIs叫Transformation API for XML (TrAX)。
  
  从此JAXP就叫Java API for XML Processing. JAXP通过逐步进化,支持的东西也越来越多
  
  不仅仅是解析xml文件(譬如在解析文档的时候根据schema校验有效性,根据预解析的schema来校验文档有效性,计算XPath 表达式等等)。
  
  由于底层用来处理xml文档的可插拔的processor是任意编写的,只要它符合JAXP的规范,因此JAXP 是一个轻量级的处理xml文件的处理APIs。(译者注:JAXP只是一个api规范而已,真正底层实现是任意的。后面会有具体介绍。)
  
  使用JAXP来解析XML文档
  
  JAXP支持基于对象和基于事件的两种解析方式。基于对象的解析,到目前为止只支持W3C DOM解析,JAXP的专家组可能在JAXP的将来版本中会支持J-DOM规范。基于事件的解析,只有SAX 解析模式被支持,另一个基于事件的解析模式叫Pull Parsing,本来它应该是JAXP的一部分。但是对于Pull Parsing存在有一份不同的JSR (#173)文档,也就是大家所知道的Streaming API for XML (StAX) parsing,现在我们对于那个也没什么更多的可以做了。
  
 Java API for XML Parsing(JAXP)演进(图一)
  Figure 1: Various mechanism of parsing XML

  
  使用SAX来解析XML文档
  
  SAX APIs 是在1998年的早些时候由David Megginson提出的,目标是成为基于事件驱动的xml文档解析模式的标准API(这里你可以的到一些 SAX 的历史信息)。即使这样,SAX仍不是W3C 的REC。但毫无疑问实际中它是行业内解析XML文档的标准。
  
  SAX 是一种基于事件的解析模式,是push-parsing原理,解析文档的时候,当碰到<opening> 标签, </closing>标签 或字符等,SAX 都会产生相应的事件(event)。一个SAX解析器解析XML文档的时候,把文档看作为一个流,依次产生相应的事件报告给已注册的content handler, org.xml.sax.ContentHandler,假如有错误,错误会报告给error handler, org.xml.sax.ErrorHandler.
  
  假如你不注册一个error handler,那你就根本不会知道在解析XML文档的时候有没有错误产生和错误是什么。因此,在SAX解析XML文档的时候注册一个error handler是极其重要的。
  
  假如程序需要知道有什么事件产生了(并且想处理此事件),那你必须实现org.xml.sax.ContentHandler 接口并注册给 SAX解析器。一个典型的事件被触发的顺序是
  
  startDocument, startElement, characters, endElement, endDocument。
  
  startDocument 仅仅被触发一次而且是在触发其它event之前。同样,endDocument仅仅被触发一次而且是在整个文档被成功解析之后。你可以从SAX javadocs中获取更具体的信息。
  
 Java API for XML Parsing(JAXP)演进(图二)
  Figure 2: SAX Parsing XML

  
  使用JAXP,通过SAX parse XML document的代码片断:
  
  SAXParserFactory spfactory = SAXParserFactory.newInstance();
  spfactory.setNamespaceAware(true);
  SAXParser saxparser = spfactory.newSAXParser();
  //write your handler for processing events and handling error
  DefaultHandler handler = new MyHandler();
  //parse the XML and report events and errors (if any) to the handler
  saxparser.parse(new File("data.xml"), handler);
  
  文档对象模型解析
  
  DOM 解析是基于对象的原理,当用DOM解析XML文档时它会在内存中生成一个树形的结构来表示一个XML文档。

Tags:Java API for

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接