陈伟(cowoo@hit.edu.cn)分布式应用技术基础实验分布式应用技术基础实验JavaXMLProgramming2OutlineWhatisXMLXMLBasicsJavaandXML•DOM&SAX•DOM实现•JDOM&Dom4j模型选择代码演示3OutlineWhatisXMLXMLBasicsJavaandXML•DOM&SAX•DOM实现•JDOM&Dom4j模型选择代码演示4WhatisXMLXML(ExtensibleMarkupLanguage)•可扩展标记语言(ExtensibleMarkupLanguage,XML)提供了一种标记内容的方式,可以添加关于数据用途的信息。信息使用XML存储之后,称为解析器的应用程序就能够可靠地提取相关信息,并根据不同的需要处理。XML可以用来做什么?•XML可用于各种不同的应用程序,但其实质是:XML是一种表示数据的方式。有时候数据是为数据库准备的,有些时候则是供人阅读的。与这两方面应用相关的技术,比如数据验证和XML转换也已经随着XML自身一起发展起来。ParserAPIs5OutlineWhatisXMLXMLBasicsJavaandXML•DOM&SAX•DOM实现•JDOM&Dom4j模型选择代码演示XMLBasics6XMLBasicsXML1.0•TheRootElement•Elements•Attributes•Entityreferencesandconstants•Unparseddata7Namespaces(名称空间)•AnXMLnamespaceisameansofassociatingoneormoreelementsinanXMLdocumentwithaparticularURI.DTD(DocumentTypeDefinition,文档类型定义)•TheDTDdefineshowdataisformatted.XMLSchema•XMLSchemaisanewlyfinalizedcandidaterecommendationfromtheW3C.ItseekstoimproveuponDTDsbyaddingmoretypingandquiteafewmoreconstructsthanDTDs,aswellasfollowinganXMLformat.XSL•XSListheExtensibleStylesheetLanguage.Itisdefinedasalanguageforexpressingstylesheets.XSLT•XSLTransformations.XSLTisthelanguagethatspecifiestheconversionofadocumentfromoneformattoanother(whereXSLdefinedthemeansofthatspecification).XPath•XPathprovidesamechanismforreferringtothewidevarietofelementandattributenamesandvaluesinanXMLdocument.12OutlineWhatisXMLXMLBasicsJavaandXML•DOM&SAX•DOM实现•JDOM&Dom4j模型选择代码演示DOMDOM(DocumentObjectModel)•DOM(“文档对象模型”)是用与平台和语言无关的方式表示XML文档的官方W3C标准。对于任何Java特定的模型,它是很好的对照。为了值得与DOM标准分开,Java特定模型应该提供比JavaDOM实现更优越的性能和/或易用性的优势。•DOM定义充分利用了XML文档不同组件的接口和继承性。这为开发者带来了将公共接口用于几个不同类型组件的优势,但是同时增加了API的复杂性。因为DOM是与语言无关的,所以接口不需要利用公共Java组件,例如,Collections类。基本上所有流行的语言都实现了DOM,比如Java,C++,Perl,Python和RubySAXSAX(SimpleAPIforXML)•DOM方法涉及读取整个文件并将该文件存储在一个树结构中,这样可能是低效、缓慢的,而且很消耗资源。•SAX允许在读取文档时处理它,而不必等待整个文档被存储后才采取操作。•在DOM和SAX中间做出选择–应用程序的目的–数据容量–数据将如何被使用–对速度的要求15OutlineWhatisXMLXMLBasicsJavaandXML•DOM&SAX•DOM实现•JDOM&Dom4j模型选择代码演示DOM实现Crimson•Crimson是基于SunProjectX解析器的Apache项目。它合并一个包含DTD支持的完整验证解析器。可以通过SAX2接口访问该解析器,并且DOM实现可以与其它SAX2解析器一起工作。Crimson是在Apache许可证下发布的开放源码。Xeceres•XercesJava是另一个Apache项目。初始时,Xerces基于IBMJava解析器(通常称为XML4J)。如同使用Crimson一样,可以通过SAX2接口和DOM来访问Xerces解析器。然而,Xerces不提供将XercesDOM与不同的SAX2解析器一起使用的任何方法。XercesJava包含对DTD和XMLSchema的验证支持(仅带有对Schema支持的最小限制)。JAXPCrimson和Xeceres恩仇录•Crimson来自于Sun捐赠给Apache的ProjectX项目,Xerces来自IBM捐赠给Apache的XML4J项目,结果Xerces胜出,成了ApacheXML小组全力开发的XMLAPI,而Crimon已经早就不做了,如今Xerces名满天下,到处都是在用XercesDOM和SAX解析器,只有Sun不服气,非要在JDK1.4里面使用过时的Crimson,让人感觉像是在赌气一样,真是让人可怜又可气!不过IBM发行JDK用的XML解析器自然是Xerces。JAXP(JavaAPIforXMLProcessing)•Sun在XML领域总是后知后觉,等到Sun重视XML的时候,XML的API早就满天飞了,尤其是IBM具有非常大的领先优势。不过Sun是规范的制订者,于是参考W3C的标准制订了JAXP规范。JAXP不像Xerces和Crimon那样,它只是一个spec,本身是不做任何事情的,它的作用就是提出一个统一的接口,让其它的XMLAPI都来遵循JAXP编程,那么用JAXP写出来的程序,底层的API可以任意切换。18OutlineWhatisXMLXMLBasicsJavaandXML•DOM&SAX•DOM实现•JDOM&Dom4j模型选择代码演示JDOMWhyJDOM•W3C的DOM标准API难用的让人想撞墙,于是有一帮人开发Java专用的XMLAPI目的是为了便于使用•JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。•jdom相当于上面的JAXP接口+XercesDOM实现部分,它本身没有解析器,它可以使用Xerces或者Crimson的解析器,就是这样:–jdom应用程序-jdomAPI-Xerces/Crimson解析器dom4jJDOM开发到一半的时候,另一部分人又分了出来,他们有自己的想法,于是他们就去开发dom4j,形成了今天这样两个API(可以看出Java开源世界的一些特征^^)dom4j和jdom类似,不过他自己绑定了一个叫做Alfred2的解析器,功能不是很全,但是速度很快,当没有其它的解析器的时候,dom4j将使用Alfred2解析器,如下:•dom4j应用程序-dom4jAPI-Xerces/Crimson解析器•或者•dom4j应用程序-dom4jAPI-Alfred2解析器在SF上下载的dom4j.jar是不含Alfred2解析器的,而dom4j-full.jar包含了Alfred2解析器,在这种情况下,实际上你什么也不需要,光是一个dom4j-full.jar就全部都包括了。21OutlineWhatisXMLXMLBasicsJavaandXML•DOM&SAX•DOM实现•JDOM&Dom4j模型选择代码演示模型选择JDOM和CrimsonDOM在性能测试时一直表现不佳。在小文档情况下还值得考虑使用CrimsonDOM。虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。然而,如果不进行API的重新构建,JDOM可能难以达到与其它模型匹配的性能。Dom4j提供了具备更标准化的优越性能和功能更全的实现,包括对SAX2、DOM甚至XPath的内置支持。虽然XercesDOM(带有延迟的节点创建)对于小文件和Java序列化性能不佳,但是在大多数评测时仍然出色。对于常规XML处理,dom4j和XercesDOM都是很好的选择,对它们的选择取决于您认为是特定于Java的特性更重要还是跨语言的兼容性更重要。如果不是那么在乎可移植性,强烈建议采用dom4j。23OutlineWhatisXMLXMLBasicsJavaandXML•DOM&SAX•DOM实现•JDOM&Dom4j模型选择代码演示演示例子根据输入流构建文档遍历元素和内容,并做一些更改:•从文本内容中除去前导和尾随的空白。•如果结果文本内容为空,就删除它。•否则,将它包装到父元素中一个名为“text”的新元素中。将已修改的文档写入输出流练习•在Eclipse中完成上述用Dom4j解析XML的例子