1、源码网资料下载:第八章 编程接口编程接口指应用程序访问XML文档的API,常用的有DOM、SAX和JDOM三种,及微软的MSXML和.NET的Xml、Java的JAXP三个。本章先概述XML之API的基本情况,然后分别介绍这三种和三个API的主要内容、编程方法和应用实例。一、概述1API1)需要为了开发XML应用程序,必须分析XML文档(包括识别元素标签、属性、注释和指令以及解析实体),以访问文档的各个语法成分和数据(如元素、属性、文本、注释和处理指令等)。(源码网整理:)为了避免低层次重复开发,需要有现成的语法分析器及其动态链接库DLL作编程接口。为了防止各公司开发的分析器互不兼容,造成程序
2、不通用,需要制定统一的接口规范(似ODBC/JDBC于数据库)。所以就有了W3C的DOM、XML-DEV邮件列表成员的SAX和Hunter&McLaughlin的JDOM及微软的MSXML、Java(Sun)的JAXP等编程接口。2)地位XML文档 XML分析器 API XML应用程序.xml .dll DOM/SAX/JDOM .exeMSXML/.NET Xml/JAXP3)优点l 保证语法和格式正确l 简化文档操作l 与数据库结合/转换良好4)功能l 可读取数据、遍历文档l 可动态创建文档l 可动态添加、修改和删除文档内容l 可动态改变处境表现2DOM1)概念DOM = Document
3、 Object Model(文档对象模型),是W3C为HTML和XML分析器制定的标准接口规范。它允许程序和脚本动态访问和更新文档的内容、结构和样式。其实,文档对象模型并不是什么新东西,早在HTML的JavaScript等脚本语言中,就把窗口、文档、历史等对象作为浏览器模型的一部分。只是不同的浏览器和脚本语言实现这些对象的方式有所不同,存在通用性和兼容性问题。而DOM则是W3C提出的一种HTML和XML文档处理的通用接口标准。对于XML应用开发来说,DOM是一个对象化的XML数据接口。其实,DOM本身是一组对象的集合,通过操纵这些对象,程序员可以操控HTML和XML数据,对文档进行读取、遍历、
4、修改、添加和删除等操作。下面是DOM Level 1摘要的参考译文:本规范定义了文档对象模型的级别1,一种平台与语言中立的接口,允许程序和脚本动态访问和更新文档的内容、结构和样式。文档对象模型提供了一个表示HTML和XML文档的标准对象集合,一个如何将这些对象组合起来的标准模型,和一个访问并操作它们的标准接口。供货商可以支持DOM作为其专有数据和API的接口,而内容作者可以按标准DOM接口而不是按产品特定的API来编写,从而增加其在Web上的互操作性。该DOM规范的目标是为XML和HTML定义一个编程接口。DOM级别1规范被分成两个部分:核心与HTML。核心DOM级别1部分,既提供一个可以表示
5、任何结构的文档的基本接口的低级集合,又定义了表示XML文档的扩展接口。这些扩展的XML接口不必被一个只提供对HTML文档访问的DOM实例去实现;但是核心部分的所有基本接口则必须全被实现。一个遵循DOM的实现,若其实现了扩展XML接口,则它必须也实现基本核心接口,但不必实现HTML接口。HTML级别1部分提供了额外的高级接口,与核心级别1 部分所定义的基本接口一起使用,以提供更方便的HTML文档之视图。一个遵从HTML DOM的实现,应该实行所有的基本核心接口以及HTML接口。2)特点DOM具有如下特点:l 独立于语言(Java/C+/VB/JavaScript)l 跨平台(Unix/Linux
6、/ Windows/MacOS)l 可同时用于HTML和XMLl 基于OMG(Object Management Group对象管理组)制定的CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构)标准,目前最新标准为2008年1月4日推出的CORBA 3.1版l 使用OMG的IDL(Interface Definition Language接口定义语言)来定义接口(ISO/IEC 14750:1999 Information technology - Open Distributed Processing - Interface
7、 Definition Language信息技术开型分布处理接口定义语言)3)级别DOM有三个级别:l DOM Level 1:(基于1998年7月1日推出的CORBA 2.2规范)n 1.0 REC (1998.10.1):Document Object Model (DOM) Level 1 Specification Version 1.0 - W3C Recommendation 1 October, 1998n 1.0 2nd Ed WD (2000.9.29):Document Object Model (DOM) Level 1 Specification (Second Edi
8、tion) Version 1.0 - W3C Working Draft 29 September, 2000l DOM Level 2 (基于1999年10月7日推出的CORBA 2.3.1规范,被分成核心、视图、事件、样式、遍历与范围、HTML等六个部分):n 核心1.0 REC(2000.11.13):Document Object Model (DOM) Level 2 Core Specification Version 1.0 - W3C Recommendation 13 November, 2000n 视图1.0 REC (2000.11.13):Document Objec
9、t Model (DOM) Level 2 Views Specification Version 1.0 - W3C Recommendation 13 November, 2000n 事件1.0 REC (2000.11.13):Document Object Model (DOM) Level 2 Events Specification Version 1.0 - W3C Recommendation 13 November, 2000n 样式1.0 REC (2000.11.13):Document Object Model (DOM) Level 2 Style Specifica
10、tion Version 1.0 - W3C Recommendation 13 November, 2000n 遍历与范围1.0 REC (2000.11.13):Document Object Model (DOM) Level 2 Traversal and Range Specification Version 1.0 - W3C Recommendation 13 November, 2000n HTML 1.0 REC (2003.1.9):Document Object Model (DOM) Level 2 HTML Specification Version 1.0 - W3
11、C Recommendation 09 January 2003l DOM Level 3 (也基于CORBA 2.3.1规范,目前包含核心、装入与保存、验证、X路径、需求、视图与格式化、事件、抽象模式等八个部分):n 核心1.0 REC (2004.4.7):Document Object Model (DOM) Level 3 Core Specification Version 1.0 - W3C Recommendation 07 April 2004n 装入与保存1.0 REC (2004.4.7):Document Object Model (DOM) Level 3 Load a
12、nd Save Specification Version 1.0 - W3C Recommendation 07 April 2004n 验证1.0 REC (2004.1.27):Document Object Model (DOM) Level 3 Validation Specification Version 1.0 - W3C Recommendation 27 January 2004n 事件 WD(2009.9.8):Document Object Model (DOM) Level 3 Events Specification - W3C Working Draft 8 Se
13、ptember 2009u 服务器发送事件 WD(2009.12.22):Server-Sent Events - W3C Working Draft 22 December 2009n X路径1.0 NOTE (2004.2.26):Document Object Model (DOM) Level 3 XPath Specification Version 1.0 - W3C Working Group Note 26 February 2004n 需求NOTE (2004.2.26):Document Object Model (DOM) Requirements - W3C Worki
14、ng Group Note 26 February 2004n 视图与格式化1.0 NOTE (2004.2.26):Document Object Model (DOM) Level 3 Views and Formatting Specification Version 1.0 - W3C Working Group Note 26 February 2004n 事件1.0 NOTE (2003.l1.7):Document Object Model (DOM) Level 3 Events Specification Version 1.0 - W3C Working Group Not
15、e 07 November 2003n 抽象模式1.0 NOTE (2002.7.25):Document Object Model (DOM) Level 3 Abstract Schemas Specification Version 1.0 - W3C Note 25 July 20023SAXSAX(Simple API for XML,XML的简单API)不是W3C的标准,而是由XML-DEV邮件列表成员(主要成员有:Peter Murray-Rust、Tim Bray和David Megginson,由Megginson整理)于1998年为Java语言开发的一种基于事件的简单API
16、。但它使用广泛,目前有四个版本:SAX1 (V1.0:1998.5.11)、SAX2 (V2.0:2000.5.5)、SAX2 r2 (V2.0.1:2002.1.29) 和SAX2 r3 (V2.0.2:2004.4.26)。4JDOM鉴于DOM使用不太方便,而SAX又不能随机处理XML文档,Jason Hunter与Brett McLaughlin于2000年春天,开始创建一种能充分利用Java特性的处理XML文档之APIJDOM(Java-based DOM,基于Java的DOM),它是一个基于Java的对象模型,也采用树状结构,能使读取、操作和写入XML文档,比DOM更容易、更高效。已
17、经推出的正式版本有JDOM 1.0(2004.9.9,3.7MB)、JDOM1.1(2007.11.14,3.4MB)和JDOM 1.1.1(2009.7.26,3.9MB)。5DOM、SAX与JDOMDOM适用于XML文档的结构化处理(创建文档树,需要将整个文档读入内存);而SAX并不创建文档树结构(不需将整个文档读入内存),所以简单快速、效率高、可处理大型文件。但SAX不能随机访问文档,且目前还没有获得主流浏览器的支持。JDOM与DOM类似,也在内存中创建文档树结构,可以随机访问文档内容,但是与Java结合紧密,使用方便,速度较快。比较DOMSAXJDOM标准制定者W3C官方XML-DEV
18、 ML群众J.Hunter&B.McLaughlin个人处理文档类型XML和HTMLXMLXML处理方式基于树基于事件基于树读入文档方式整个文档,并在内存中建文档树流式,不在内存中建文档树整个文档,并在内存中建文档树访问方式随机顺序随机速度慢快较快需内存大小中处理功能强大简单强大接口级别高级低级高级支持语言各种编程与脚本语言Java、C+、Python等编程语言只能Java库函数由XML解析器提供SAX包可提供JDOM可提供适用文档的结构化随机处理(大型)文档的简单顺序处理文档的结构化随机处理可见,DOM与SAX各有优缺点和特色,适用于不同的应用,会长期并存下去。所以存在两个XML接口标准,与
19、统一API的初衷并不矛盾。而JDOM比DOM使用方便,可在Java平台替代DOM。6MSXMLMSXML(Microsoft XML Core Services,微软XML核心服务)是微软公司的一个基于COM组件的服务集,允许程序员使用JScript、VBScript和Microsoft Visual Studio 6.0来创建高性能的基于XML的Windows本地应用程序,并提供与其它符合XML1.0标准的应用程序的高度互操作性。MSXML支持XML 1.0、DOM、SAX、XPath 1.0、XSLT 1.0、XML Schema、及其它XML相关技术。MSXML组件一般随IE发布(IE
20、4.0 MSXML 1.0、IE 5.0a MSXML 2.0a、IE 6.0 MSXML 3.0 SP2),MSXML 6.0还随Visual Studio 2005和Microsoft .NET Framework 3.0(Windows Vista)发布。7.NET Xml下面介绍.NET平台的XML编程基础。.NET是微软公司为了与Sun公司的Java/J2EE/EJB竞争,于2000年6月22日提出来的一种跨语言、跨平台的新计算技术,是微软COM组件技术的一种发展。.NET适用于客户端程序、Web服务(Web services)和因特网分布式应用,是生成、部署和运行托管应用程序和XM
21、L Web服务的一种多语言环境和可视化开发工具。微软的.NET技术,由(包含公共语言运行环境CLR和框架类库FCL的).NET框架(.NET Framework)和(托管应用程序开发平台)Visual Studio这两大部分组成。PC硬件Win32/Win64调用语言运行时CLR (CLI)MSMQ(信息队列)COM+(事务、分区、对象池)ADOIISVisual Studio基类库BCLADO.NET与XMLWeb服务用户界面ASP.NET公共语言规范CLS (CTS).NET框架.NETC#VBC+JScriptPerlF#Python微软中间语言MSIL (CIL)框架类库FCL.NET
22、技术的构成l CLR(Common Language Runtime,通用语言运行库/公共语言运行时) 该运行时/库在组件的运行时和开发时的操作中都起着很大作用:n 在组件运行时,运行库除了负责满足此组件在其他组件上可能具有的依赖项外,还负责管理内存分配、启动和停止线程和进程,以及强制执行安全策略。n 在开发时,运行库的作用稍有变化;由于做了大量的自动处理工作(如内存管理),运行库使开发人员的操作非常简单,尤其是与今天的 COM 相比。特别是反射等功能显著减少了开发人员为将业务逻辑转变为可重用组件而必须编写的代码量。l FCL(Framework Class Library,框架类库) 该框架
23、为开发人员定义并提供了统一的、面向对象的、分层的和可扩展的类库集,其中最主要的是供应用程序编写者使用的.NET基类库(BCL, Base Class Library)FCL中的System子命名空间。通过创建跨所有编程语言的公共 API 集,公共语言运行库使得跨语言继承、错误处理和调试成为可能。从 JScript、Visual Basic 到 C+、J#、C#的所有编程语言(通过托管扩展)具有对框架的相似访问,开发人员可以自由选择它们要使用的语言。l System.Xml提供基于标准的XML处理支持n System.Xml.Schema包含提供基于标准的XML模式定义语言(XSD)模式支持的X
24、ML类n System.Xml.Serialization包含用于将对象序列化为XML格式的文档或流的类n System.Xml.XPath包含XPath分析器和计算引擎。它支持W3C XML路径语言(XPath) 1.0版建议(www.w3.org/TR/xpath)n System.Xml.Xsl提供可扩展样式表转换(XSLT)转换支持。它支持W3C XSL转换(XSLT)1.0版建议8JAXPJAXP(JavaTM API for XML Processing,用于XML处理的Java API)是Java平台处理XML的基本工具,包括DOM、SAX、TrAX和StAX等。在1.1版之前,
25、JAXP是额外的模块,支持DOM1(1998年10月1日/第2版2000年9月29日)。从J2SE 1.4(2002年2月11日)起,JDK自带JAXP 1.2作为其标准的组成部分,支持DOM2(2000年11月13日)。而J2SE 5.0 (2004年10月5日)的JDK 1.5所带的JAXP 1.3开始支持DOM3(2004年4月7日)。Java SE 6.0(2006.12.11)的JDK 1.6所带的JAXP 1.4增加了对StAX(the Streaming API for XML,XML流API)的支持。备注:TrAX(Transformations API for XML,进行X
26、ML转换的API)是Java用于XML样单转换(XSLT)的应用程序接口,具有充分的分析器和模型独立性,适用于各种XSLT处理器,可以在XML流、SAX事件序列和DOM与JDOM树之间进行转换。TrAX是JAXP的标准组成部分,捆绑在JDK 1.4以上的版本中,位于javax.xml.transform包内,含6个接口(ErrorListener、Result、Source、SourceLocator、Templates、URIResolver)、3个类(OutputKeys、Transformer、TransformerFactory)、2个异常(类:TransformerConfigura
27、tionException、TransformerException)和1个错误(类:TransformerFactoryConfigurationError)。JDK所带的缺省XSLT处理器的实现版本为Xalan-J。9例子文档下面的文档例会用于后面的各接口和工具中的编程实例之中。1)DTD(info.dtd):2)中文版XML文档(info1.xml):张三李四3)英文版XML文档(info2.xml):Zhang SLi S4)文档树注释文档类型infopersonnameemailsex=”male”张三personnameemail李四sex=”female”测试样例Curor: b
28、linkxml: version=1.0 standalone=no infoPIPI5)节点共18个节点,罗列如下:l / 根节点( xmlDoc)(1个)n nodeType = DOCUMENT_NODEn nodeName = “#document”n nodeValue = nulll XML声明伪处理指令节点(1个)n nodeType = PROCESSING_INSTRUCTION_NODEn nodeName = “xml”n nodeValue = version=1.0 standalone=nol 文档类型节点(1个)n nodeType = DOCUMENT_TYPE
29、_NODEn nodeName = “info”n nodeValue = nulll 注释节点(1个)n nodeType = COMMENT_NODEn nodeName = “#comment”n nodeValue = “测试样例”l info根元素节点(1个)n nodeType = ELEMENT_NODEn nodeName = “info”n nodeValue = nulll person主元素节点(2个)n nodeType = ELEMENT_NODEn nodeName = “person”n nodeValue = nulll sex属性节点(2个)n nodeTyp
30、e = ATTRIBUTE_NODEn nodeName = “sex”n nodeValue = “male”或“female”l name子元素节点(2个)n nodeType = ELEMENT_NODEn nodeName = “name”n nodeValue = nulll email子元素节点(2个)n nodeType = ELEMENT_NODEn nodeName = “email”n nodeValue = nulll 文本节点(4个)n nodeType = TEXT_NODEn nodeName = “#text”n nodeValue = “张三”或“李四”、“”或
31、“”l 处理指令节点(1个)n nodeType = PROCESSING_INSTRUCTION_NODEn nodeName = “Cursor”n nodeValue = “blink”二、DOMDOM = Document Object Model(文档对象模型),是W3C为HTML和XML分析器制定的标准接口规范。它允许程序和脚本动态访问和更新文档的内容、结构和样式。DOM 有DOM Level 1、DOM Level 2和DOM Level 3共三个等级。DOM1被分成两个部分:核心与HTML。核心部分又被分成可表示任何结构的文档的基本接口的低级集合及表示XML文档的扩展接口。与D
32、OM1相比,DOM2新定义了若干模块(视图、事件、样式、遍历与范围),而DOM3又对DOM2进行了改进(增加了装入与保存和验证两个推荐标准(Recommendation),将原来的视图和样式两个推荐标准改成视图与格式化一个注记(Note),将事件推荐标准也改成了注记,另外又增加了X路径、需求和抽象模式三个注记)下面是DOM Level 3各个组成部分的关系图:(其中的三个蓝色部分为DOM Level 1的,绿色部分为DOM Level 2增加的,白色的部分为DOM Level 3新增的)由于时间有限,下面只介绍DOM级别1。1组成与对象模型1)组成DOM1由三部分组成:核心基本XML HTML
33、标准文本被分成两章:核心Core(包括基本接口和XML扩展接口)和HTML(接口),即:l DOM Level 1:n 核心Coreu 基本接口(Fundamental Interfaces)结构化文档的底层对象集合u XML扩展接口(Extended XML Interfaces)专为处理XML文档而提供的高层扩展接口n HTML专为处理HTML文档而提供的高层扩展接口2)对象模型DOM将顺序的文档转换为可以进行层次化访问的树状结构的文档模型:其中的树节点不是简单的数据结构,而是包含属性和方法的对象(如文档对象Document、元素对象Element、属性对象Attr、文本对象Text),所
34、以才叫做DOM。对象模型可以实现:l 用来表示和操作文档的接口l 接口的行为和属性l 接口之间的关系及互操作注意:l DOM中的接口(interface)C+的类(class)l 接口中的属性(attribute)C+的数据成员(data member)l 接口中的方法(method)C+的成员函数(member function)其实DOM中的接口、属性和方法都类似于Java的。3)层次结构下面是DOM1的12种节点类型的在节点树中的父子层次关系:(里面为各种接口名)1. 文档(Document)Element (最多一个), ProcessingInstruction, Comment,
35、DocumentType2. 文档片段(DocumentFragment)Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference3. 文档类型(DocumentType)无子节点4. 实体引用(EntityReference)Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference5. 元素(Element)Element, Text, Comment, ProcessingInstruction, C
36、DATASection, EntityReference6. 属性(Attr)Text, EntityReference7. 处理指令(ProcessingInstruction)无子节点8. 注释(Comment)无子节点9. 文本(Text)无子节点10. CDATA节(CDATASection)无子节点11. 实体(Entity)Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference12. 记号(Notation)无子节点其中,2、4、5、11的可能子节点是一样的。下面是DOM1核心部分接口
37、的继承层次结构模型图:记号Notation节点Node实体Entity实体引用EntityReference字符数据CharacterData处理指令ProcessingInstruction属性Attr元素Element文档Document文档片段DocumentFragment文档类型DocumentType文本Text注释CommentCDATA节CDATASection节点列表NodeList命名节点映射NamedNodeMapDOM异常DOMExceptionDOM实现DOMImplementation2DOM的核心接口DOM有如下四个主要的基本接口:l Document(文档)对文
38、档进行操作的入口,是Node的派生接口l Node(节点)表示文档树的节点,是大多数接口的父接口l NodeList(节点列表)有序节点集合(如子树)l NameNodeMap(命名节点映射)无序节点集合(由节点名属性获得的节点集)1)Document接口Document(文档)接口代表整个文档(似文档树的根节点),是对文档中的数据进行访问的和操作的入口。文档的顶层子节点有一个根元素/文档元素子节点(一个文档类型属性)和若干注释和处理指令节点。Document文档注释 文档类型 处理指令 根元素 记号 处理指令(Document.doctype) (Document.documentEleme
39、nt)文档接口比较复杂,有3个属性和9个方法,父接口为节点接口。常用属性:l doctype文档类型记录文档的类型声明l documentElement文档元素代表文档的根元素常用方法:l createElement创建元素创建新元素l createAttribute创建属性创建新属性l createTextNode创建文本节点创建新文本节点下面是文档接口的IDL定义(IDL Definition):父接口interface Document : Node 属性 readonly attribute DocumentType doctype; readonly attribute DOMImp
40、lementation implementation; readonly attribute Element documentElement; ElementcreateElement(in DOMString tagName) raises(DOMException); DocumentFragmentcreateDocumentFragment(); TextcreateTextNode(in DOMString data); CommentcreateComment(in DOMString data);方法 CDATASectioncreateCDATASection(in DOMSt
41、ring data) raises(DOMException); ProcessingInstructioncreateProcessingInstruction(in DOMString target, in DOMString data) raises(DOMException); AttrcreateAttribute(in DOMString name) raises(DOMException); EntityReferencecreateEntityReference(in DOMString name) raises(DOMException); NodeListgetElemen
42、tsByTagName(in DOMString tagname);2)Node接口Node(节点)接口代表文档树中的一个节点,有多种节点类型(DOM1中定义了12种,参见IDL定义),用符号常量表示,如:ELEMENT_NODE、ATTRIBUTE_NODE、TEXT_NODE等。节点接口比较复杂,有12个节点类型属性常量、11个其他属性和6个方法,没有父接口。常用属性:l nodeType节点类型可取值:ELEMENT_NODE元素节点、ATTRIBUTE_NODE属性节点、TEXT_NODE文本节点、CDATA_SECTION_NODE字符数据节节点、ENTITY _REFERENCE_
43、NODE实体引用节点、ENTITY_NODE实体节点、PROCESSING _INSTRUCTION_NODE处理指令节点、COMMENT_NODE注释节点、DOCUMENT _NODE文档节点(根节点)、DOCUMENT_TYPE_NODE文档类型节点、DOCUMENT _FRAGMENT_NODE文档片段节点、NOTATION_NODE记号节点,共12种节点类型l nodeName节点名称如元素名、属性名等l nodeValue节点值如属性值、文本串等l attributes属性属性的无序集(NamedNodeMap类型)l parentNode父节点单个节点l childNodes子节点有序节点集(NodeList类型)l firstChild首子节点父节点的第一个子节点l lastChild尾子节点父节点的最后一个子节点l previousSibling前一兄弟直接前驱兄弟节点l nextSibling下一兄弟直接后继兄弟节点下面是一个典型的节点接口(元素节点):父节点前兄节点后弟节点当前节点nodeType=ELEMENT_NODEnodeName=”学生”no