http://www./Java/HTML/75888.html
简介
在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,现在我们对于那个也没什么更多的可以做了。
 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中获取更详细的信息。
 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文档。树上的每个节点代表着XML文档中的一个节点。
如果一个DOM解析器符合W3C标准,那它产生的DOM就是W3C的DOM,使用org.w3c.dom APIs就能遍历和修改这个DOM。 大部分DOM解析器允许你抽取XML文档里的一部分来生成DOM树,而不是把整个XML文档在内存中建立对应DOM树。
 Figure 3: DOM Parsing XML
使用JAXP, 通过DOM parse XML document的代码片断: DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); dbfactory.setNamespaceAware(true); DocumentBuilder domparser = dbfactory.newDocumentBuilder(); //parse the XML and create the DOM Document doc = domparser.parse(new File("data.xml")); //to create a new DOM from scratch - //Document doc = domparser.newDocument(); //once you have the Document handle, then you can use //the org.w3c.dom.* APIs to traverse or modify the DOM... 在校验模式下进行解析 根据DTD校验
DTD 是XML 文档的语法。经常人们会觉得DTD有点另类,因为它和XML的syntax不一样,但DTD是W3C
XML1.0里的完整的一部分。如果一份XML文档声明了DOCTYPE,并且想在解析的时候根据DTD校验文档,那你必须在适当的factory里启用
根据DTD校验文档(validation)这个特性。例如: DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); dbfactory.setValidating(true); OR SAXParserFactory spfactory = SAXParserFactory.newInstance(); spfactory.setValidating(true);
注意,如果XML文档声明了一个DTD
,即使你不启用校验(validation)这个特性,解析器总是试着去读入这个DTD。 这样做的目的是为了保证XML文档中entity
reference被正确的扩展了,否则会导致格式不正确的XML文档,只有在XML文档序言部分的声明中standalone属性被置为true时,外
部的DTD才会被完全忽略掉。例如: <?xml version="1.1" encoding="UTF-8" standalone="yes"?> 根据W3C Schema来校验XML文档(WXS)
XMLSchema
是XML文档的另外一种文法描述。XMLSchema非常流行市因为它和XML文档使用同样的语法并且提供了丰富的定义校验限制的特性。如果一个XML文
档用"schemaLocation"
和"noNamespaceSchemaLocation"指向了一个schema,结下来你想启用根据XMLSchema校验文档这个特性,你还要做如
下的步骤: 1.和上面说的一样,调用SAXParserFactory o或DocumentBuilderFactory的setValidating函数来启用validation这个特性。 2.把属性 "http://java./xml/jaxp/properties/schemaLanguage" 值设为 "http://www./2001/XMLSchema" 注意,这种情况下,即使XML文档有DOCTYPE声明,处理器仍不会用DTD来校验这个文档。但是和前面提到的一样,为了任何一个entity reference是被正确扩展的,这个DTD还是会被装载的,
既然"schemaLocation"
和"noNamespaceSchemaLocation"仅仅是提示,所以可以使用属性"http:
//java./xml/jaxp/properties/schemaSource"从外部提供schemas来覆盖这些提示。 对于这个属性,一些可以接受值是: ·是一个代表schema的URL地址的字符串。 ·java.io.InputStream with the contents of the schema ·org.xml.sax.InputSource ·java.io.File ·一个 java.lang.Object 的数组,数组内容是上面所提到三类中的一个。 例如: SAXParserFactory spfactory = SAXParserFactory.newInstance(); spfactory.setNamespaceAware(true); //turn the validation on spfactory.setValidating(true); //set the validation to be against WXS saxparser.setProperty("http://java./xml/jaxp/properties/ schemaLanguage", "http://www./2001/XMLSchema"); //set the schema against which the validation is to be done saxparser.setProperty("http://java./xml/jaxp/properties/ schemaSource", new File("myschema.xsd")); 使用JAXP的TrAX APIs来进行XML文档转换处理工作 W3C XSL-T 定义了一些转换规则来把源树转化生成结果树。在XSL-T中,转换信息所存在的文件叫样式表(stylesheet)。要用JAXP来转换一个XML文档,你需
http://blog.csdn.net/haydenwang8287/archive/2007/09/13/1784396.aspx
|