《零点起飞学Java之XML开发.pptx》由会员分享,可在线阅读,更多相关《零点起飞学Java之XML开发.pptx(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第11章 XML开发作为下一代Web应用的数据传输和交互工具,XML有着非常广泛的应用范围。在解析、操作XML文档方面,目前已经有DOM、SAX等一些相关规范。Java语言也提供了丰富的API接口来支持对XML文档的各种处理。本章将针对这些知识点进行讲解。11.1 什么是XMLXML是Extensible Markup Language(可扩展标识语言)的简写。目前推荐遵循的是W3C组织于2000年10月6日发布的XML1.0版本。XML类似于超文本标记语言(HTML)。但HTML只从如何显示以及如何相互作用的方面来描述网页的内容,而XML则从数据角度描述网页内容。下面分别从特点及语法两个方面
2、来介绍XML。11.1.1 XML的优势同HTML一样,XML同样来源于SGML。不过,XML更是一种能定义其他语言的语言。XML最初设计的目的是弥补HTML的不足,以强大的扩展性满足网络信息发布的需要,后来逐渐用于网络数据的转换和描述。XML有如下一些特点。内容与形式分离:HTML文档中显示的数据和显示数据的格式标记是融合在一起的,不包含数据的架构(Schema)信息。HTML是将数据的语义剥离出来,通过显示的标记进行显示而已。XML文档包含了数据的架构,这些架构信息(自己定义的标记)对于数据的描述、检索和处理有巨大的意义。简单易学:XML是精简的SGML,它只有SGML约20%的复杂性,却
3、具有SGML约80%的功能。XML比完整的SGML简单得多,易学、易用并且易实现。可扩展:XML继承了SGML的易扩展的特性。XML中允许开发人员根据需要自行定义标记,这些标记还可以是中文的。XML的标记数目众多,某些团体或者某些行业会自行制订一些规范的XML标记来推广使用。可移植:XML语言可以定义各种数据,如文本、图像、声音等格式都可以采用XML来表述。11.1.2 XML的构成XML文档使用的是自描述和简单的语法。一个XML文档最基本的构成包括声明、处理指令(可选)和元素等。由于本章的重点在于介绍使用Java语言操作XML文档,所以下面仅结合该示例文档对XML语法做一下简要介绍,详细内容
4、请参考其他相关书籍。1XML声明XML声明是处理指令的一种,在文件中是可选内容,可加可不加。XML声明中要求必须包括version属性,该属性指明所采用的XML的版本号。XML声明还包括两个可选属性,分别是standalone和encoding。其中,standalone属性用于指定该XML文档是否和一个独立的文档类型定义DTD配套使用;encoding属性用于指定文档所采用的编码标准。下面是上述示例文档中的XML声明。该XML声明中指定版本号为“1.0”,编码标准为“GB2312”。2XML元素XML元素由起始标记、结束标记以及标记之间的数据内容组成,多个元素可以嵌套使用。XML元素的语法格
5、式如下所示。其中,标记是必不可少的,而且要求起始标记和结束标记必须成对出现。另外,XML文档中的标记是区分大小写的,每个标记可以包含任意多个属性。在上述示例文档中,如下都是XML元素的定义。数据内容3属性XML元素中的标记可以包含任意多个属性。标记属性均是“名称/取值”对的形式,名称与取值之间用等号“=”连接。上述示例文档中定义的属性如下所示。其中,bn为book标记的属性,属性值为“001”。4XML注释在XML中,注释的方法与HTML完全相同,用“”包含注释的内容。示例文档中的注释如下所示。以上介绍的是XML语法中的最基本内容。从下面章节开始,将重点介绍如何使用Java语言操作XML文档。
6、11.2 DOM文档对象模型DOM是由W3C官方制定的表示XML文档的标准,与具体的浏览器、平台、语言无关。Sun公司提供的Java API for XML Parsing(简称JAXP)接口可以使用DOM来处理XML文件。下面就从这两个方面分别进行详细介绍。11.2.1 DOM技术构成DOM是Document Object Model文档对象模型的缩写,是以层次结构组织的节点或信息片段的集合。这个层次结构允许开发人员在树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能开始做其他工作。使用DOM时,数据以树状结构的形式被加载到内存中。如下是一个示例XML文档使用DOM
7、加载后的结构形式。其中,矩形框表示元素节点,椭圆表示文本节点。DOM使用父子关系。在这个例子中,student是具有五个孩子的根元素:三个文本节点(空白),以及两个元素节点name和sex。1Document接口Document接口是对XML文档中的数据进行访问和操作的入口,该接口表示整个XML文档。其中的Document节点对应着DOM树中的根节点。通过Document节点,可以访问XML文档的元素、处理指令、注释、文档类型等其他节点。2Node接口Node接口表示树中的一个节点。DOM树中包含的很多不同类型的节点均是从Node继承过来的,如Element、Attr等。Node接口中定义了所
8、有不同类型的节点中共有的属性与方法。3NodeList接口NodeList接口表示一组有顺序关系的节点集合。该节点集合是动态变化的,DOM文档中节点对象的改变会直接反映到对应的NodeList节点集合中。NodeList中的每个item都可以通过一个索引来访问,该索引值从0开始。4NamedNodeMap接口NamedNodeMap接口同样表示一组节点集合,只不过该集合中的节点是没有顺序关系的。NamedNodeMap接口中的节点以“节点名节点对象”的Map形式进行组织,可以通过节点名称进行访问。11.2.2 在Java中使用DOM在Java语言中提供了JAXP接口可以使用DOM来处理XML文
9、件。在javax.xml.parser包中定义了DocumentBuilderFactory和DocumentBuilder类可以对XML文档进行解析,将其转换为DOM文档。下面详细介绍一下这两个类。1DocumentBuilderFactory类DocumentBuilderFactory类为DocumentBuilder工厂类,用来生成DocumentBuilder实例。DocumentBuilderFactory类没有提供公开的构造方法,只提供了如下两种静态方法来获得自身的实例。static DocumentBuilderFactory DocumentBuilderFactory.ne
10、wInstance():该静态方法不需要参数,用于获取DocumentBuilderFactory的新实例。static DocumentBuilderFactory DocumentBuilderFactory.newInstance(String factoryClass-Name,ClassLoader classLoader):该静态方法从指定类名中获取新的DocumentBuilderFactory实例。2DocumentBuilder类DocumentBuilder类用来获取DOM文档实例。DocumentBuilder类也没有提供公开的构造方法,需要调用DocumentBuild
11、erFactory类的newDocumentBuilder()方法来获得该类实例。另外,DocumentBuilder类还提供了许多处理DOM文档的相关方法,如下所示。abstract DOMImplementation getDOMImplementation():获取DOMImplementation对象的一个实例。Schema getSchema():获取由XML处理器使用的Schema的引用。abstract boolean isNamespaceAware():指示此解析器是否被配置为可识别名称空间。abstract boolean isValidating():指示此解析器是否被配
12、置为验证XML文档。boolean isXIncludeAware():获取此解析器的XInclude处理模式。abstract Document newDocument():获取DOM Document对象的一个新实例来生成一个DOM树。通过使用javax.xml.parser包中的相关类,并结合W3C定义的DOM规范中的相关接口便可以实现采用Java语言以DOM的方式处理XML文档。下面是一个具体的应用实例。11.3 SAXSAX是非W3C官方提出的“民间”事实标准,是一种轻量型的处理XML文档的技术。Sun公司提供的Java API for XML Parsing(简称JAXP)接口同样
13、可以使用SAX来处理XML文件。下面就从这两个方面分别进行详细介绍。11.3.1 SAX技术构成SAX是Simple API for XML的缩写。与DOM比较而言,SAX是一种轻量型的XML文档处理技术。DOM方法在解析XML文档时读取整个文件并将该文件存储在一个树结构中,如果文档很大,就会要求有极大的内存。相比DOM,SAX是读取和操作XML数据更快速、更轻量的方法。SAX允许在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及DOM所必需的开销和概念跳跃。SAX有如下一些特点。1事件驱动SAX是事件驱动的。当解析器发现元素开始、元素结束、文本、文档的开始或结束等标签时,
14、发送事件,程序员编写响应这些事件的代码,处理数据。2不创建对象SAX解析器根本不创建任何对象,它只是将事件传递给应用程序。如果希望基于那些事件来创建对象,这将由程序员来完成。SAX也为XML文档的解析定义了一组API接口。具体解析时,当解析器发现元素开始、元素结束、文本、文档的开始或结束等标签时,发送事件触发DefaultHandler类中的指定方法进行处理。DefaultHandler类包含的主要方法如下所示。void characters(char ch,int start,int length):接收元素中字符数据的通知。void endDocument():接收文档结束的通知。void
15、 endElement(String uri,String localName,String qName):接收元素结束的通知。void endPrefixMapping(String prefix):接收名称空间映射结束的通知。void error(SAXParseException e):接收可恢复的解析器错误的通知。void fatalError(SAXParseException e):报告严重的XML解析错误。void ignorableWhitespace(char ch,int start,int length):接收元素内容中可忽略空白的通知。11.3.2 在Java中使用SA
16、X在Java语言中提供了JAXP接口可以使用SAX来处理XML文件。javax.xml.parser包中定义了SAXParserFactory和SAXParser类可以对XML文档进行解析。下面详细介绍一下这两个类。1SAXParserFactory类SAXParserFactory类为SAXParser工厂类,用来生成SAXParser实例。SAXParserFactory类没有提供公开的构造方法,只提供了如下两种静态方法来获得自身的实例。static SAXParserFactory SAXParserFactory.newInstance():该静态方法不需要参数,用于获取SAXPars
17、erFactory的新实例。static SAXParserFactory SAXParserFactory.newInstance(String factoryClassName,ClassLoader classLoader):该静态方法从指定类名中获取新的SAXParserFactory实例。2SAXParser类SAXParser类定义了包装XMLReader实现类的API。SAXParser类也没有提供公开的构造方法,需要调用SAXParserFactory类的newSAXParser()方法来获得该类实例。另外,SAXParser类还提供了许多处理文档的相关方法,如下所示。abst
18、ract Parser getParser():返回由此类实现封装的SAX解析器。abstract Object getProperty(String name):返回XMLReader的基础实现中请求的特定属性。Schema getSchema():获取对XML处理器使用的Schema引用。abstract XMLReader getXMLReader():返回由此类实现封装的XMLReader。abstract boolean isNamespaceAware():指示此解析器是否被配置为可识别名称空间。abstract boolean isValidating():指示此解析器是否被配置
19、为验证XML文档。boolean isXIncludeAware():获取此解析器的XInclude处理模式。void parse(File f,DefaultHandler dh):使用指定的DefaultHandler将指定文件的内容解析为XML。void parse(File f,HandlerBase hb):使用指定的HandlerBase将指定文件的内容解析为XML。void parse(InputSource is,DefaultHandler dh):使用指定的DefaultHandler将给定InputSource内容解析为XML。11.4 JDOMJDOM是一种轻量级的使用
20、Java语言处理XML文档的技术。JDOM遵循DOM的主要接口规则,除去了DOM中为了兼容各语言而与Java习惯的不同。下面就对JDOM从概述和具体使用两个方面进行详细介绍。11.4.1 JDOM技术构成作为W3C的官方标准规范,DOM适合于当今流行的各种语言,包括C、C+、Java、Java Script、VB、VBScript、Perl等。为了适应这些不同的编程语言,DOM保留了许多非常相似的API。这样,对于单纯使用Java语言的编程者来说,使用DOM处理XML文档就变得有些不习惯。JDOM正是一组专为Java编程者打造的处理XML文档的工具包。JDOM是一个开源项目。目前,JDOM最新
21、的版本为1.1。JDOM的zip文件可以在http:/www.jdom.org网址下载得到,zip文件解压后在build文件夹下面有个jdom.jar文件,即是JDOM的类包。JDOM主要由以下几个包组成。org.jdom:包含了所有的XML文档要素的Java类。org.jdom.adapters:包含了与DOM适配的Java类。org.jdom.filter:包含了XML文档的过滤器类。org.jdom.input:包含了读取XML文档的类。org.jdom.output:包含了写入XML文档的类。org.jdom.transform:包含了将jdom.xml文档接口转换为其他XML文档接口
22、的类。org.jdom.xpath:包含了对XML文档xpath操作的类。11.4.1 JDOM技术构成下面对这些包中的一些主要类作一下简单介绍。(1)org.jdom包中包含了所有XML文档要素的Java类,其中包括如下一些类。Attribute:用于描述XML文档中的属性。Coment:用于描述XML文档中的注释。DocType:用于描述XML文档类型。Document:用于描述整个XML文档。Element:用于描述XML文档中的元素。(2)org.jdom.input包中定义的输入类主要如下。SAXBuilder类:SAXBuilder提供了一种由任意面向字节的数据源来创建文档的简单机
23、制。它采用SAX解析器读取流,并根据SAX解析器的回调建立文档。DOMBuilder类:DOMBuilder由DOM树构建。如果预先已经有了一个DOM树,并希望用JDOM版本的树来代替,那么采用DOMBuilder是非常方便的。(3)org.jdom.output包中定义的输出类主要如下。XMLOutputter类:XMLOutputter将文档转换为一个字节流,用于输出到文件、流和接口程序(sockets)中。SAXOutputter类:SAXOutputter可以产生基于文档内容的SAX事件。DOMOutputter类:DOMOutputter用于生成表示文档的DOM树。(4)org.jd
24、om.transform包中在涉及xslt格式转换时应使用如下两个类。JDOMSource类:JDOMSource提供了一个JDOM文档作为转换的输入。JDOMResult类:JDOMResult捕获一个结果作为JDOM文档。11.4.2 使用JDOM了解JDOM的基本构成之后,现在来具体介绍如何使用JDOM操作XML文档。首先需要从官方网站http:/www.jdom.org/,下载JDOM包。笔者下载了目前最新版本JDOM2.0.3。开发程序时,导入包名为org.jdom2.*。下面通过简单的实例分别从对XML文档的读取和输出两个方面来介绍。1读取XML文档读取XML文档也是进行解析的过程。使用JDOM解析XML文档更符合Java编程者的习惯,对于Java用户来说,使用起来非常简单、方便。如下是一个使用JDOM解析XML文档的实例。2输出XML文档JDOM的XML文档输出非常灵活,支持很多种io格式以及风格的输出。如下是一个使用JDOM输出XML文档的实例。11.5 小 结本章介绍了Java语言中的XML开发技术,具体介绍了XML的相关概念知识、现有的一些操作规范等。本章最后给出了一个完整的实例。其中,JAXP及JDOM是本章的重点。为了更好地掌握该部分内容,读者需要在具体开发过程中多动手练习。第12章将介绍Java语言中部分常用类的使用方法。