xml编程开发教程

xml编程开发教程

ID:22063103

大小:344.00 KB

页数:30页

时间:2018-10-26

上传者:不要太帅
xml编程开发教程_第1页
xml编程开发教程_第2页
xml编程开发教程_第3页
xml编程开发教程_第4页
xml编程开发教程_第5页
资源描述:

《xml编程开发教程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

|第一章XML与DTDXML的产生:XML的全称是ExtensibleMarkupLanguage,意思是可扩展的标记语言,它是标准通用标记语言(StandardGeneralizedMarkupLanguage,SGML)的一个子集。在80年代早期,IBM提出在各文档之间共享一些相似的属性.例如字体大小和版面。IBM设计了一种文档系统,通过在文档中添加标记,来标识文档中的各种元素,IBM把这种标识语言称作通用标记语言(GeneralizedMarkupLanguage),即GML。经过若干年的发展,1984年国际标准化组织(ISO)开始对此提案进行讨论,并于1986年正式发布了为生成标准化文档而定义的标记语言标准(ISO8879),称为新的语言SGML,即标准通用标记语言。SGML功能非常强大,是可以定义标记语言的元语言。W3C介绍:W3C是万维网联盟(WorldWideWebConsortium)英文的缩写,它成立于1994年10月,以开放论坛的方式来促进开发互通技术(包括规格、指南、软件和工具),开发网络的全部潜能。万维网联盟(W3C)从1994年成立以来,已发布了90多份Web技术规范,领导着Web技术向前发展。W3C认为自身不是官方组织,因此将它正式发布的规范称为推荐(建议)标准,意思是进一步标准化的建议,但是由于该组织自身的权威性往往成为事实上的标准。一项技术要成为W3C的推荐标准,需要7个步骤:1.W3C收到提交(ReceivesaSubmission)2.W3C发布注释(PublishesaNote)3.W3C成立工作组(CreatesaWorkingGroup)4.W3C发布工作草案(PublishesaWorkingDraft)5.W3C发布候选推荐标准(PublishesaCandidateRecommendation)6.W3C发布提议的推荐标准(Publishesa |ProposedRecommendation)7.W3C发布推荐标准(PublishesaRecommendation)关于XML的问题:XML是HTML的扩展吗?HTML的全称是HypertextMarkupLanguage(超文本标记语言),而XML的全称是(ExtensibleMarkupLanguage)可扩展的标记语言,这很容易让人联想到XML是通过增加新标记来扩展HTML的一种标记语言。实际上HTML和XML在标记语言中处于不同的层次。<欢迎词>这是一个欢迎的例子<标题>这是一个欢迎的例子<内容>你好!欢迎你!你好!欢迎你!提示:XML在设计之初,就考虑到了国际化的问题,同HTML4.01一样,XML也是基于ISO/IEC10646字符集标准中定义的通用字符集(UniversalCharacterSet.UCS)。SGML、HTML和XML之间的关系:SGML、HTML和XML之间是什么关系?SGML是一种在Web发明前就早已存在的使用标记来描述文档资料的通用语言,它是一种定义标记语言的元语言。HTML和XML都是从SGML发展而来的标记语言,因此,它们有一些共同点,如相似的语法和标记的使用。不过HTML是在SGML定义下的一个描述性的语言,只是SGML的一个应用,其DTD作为标准被固定下来,而XML是SGML的一个简化版本,是SGML的一个子集,严格意义上来说,XML仍然是SGML。HTML不能用来定义新的应用,而XML可以,例如RDF和CDF那是使用XML定义的应用.事实上。XML和SGML是兼容的.但又没有SGML那么复杂,它是设计用于有限带宽的网络,如Internet.XML规范的制定者之一TimBray说,XML的设计出发点是取SGML的优点,去除复杂的部分,使其保持轻巧,可以在Web上工作。HTML、SGML和XML将继续使用于适合的地方,它们中的任何一个都不会使其它一个废弃。对于像新闻、网络日记、论坛留言等大部分短期的数据,HTML仍是在Web上快速出版数据的最简单的方法。如果数据要长期使用,并且需要更多的一些结构,我们更推荐使用XML。不同于HTML和XML,SGML可能永远不会在Internet上被广泛接受,因为它们不是为某个网络协议而设计,也从来没有为某个网络协议的需求而优化过。对于高端的、复杂结构的出版应用,SGML将继续应用。XML与HTML的比较:XML将数据与显示分开静夜思

静夜思

静夜思

李白作者:李白床前明月光

疑是地上霜床前明月先,疑是地上霜
举头望明月举头望明月,低头思故乡
低头思故乡

|XML对文档的格式要求更加严格,由于HTML文档格式非常松散,导致了HTML文档解析的复杂性,也造成了浏览器兼容的问题,所以XML从一开始,就对文档的格式制定了非常严格的标准,凡是符合这一标准的XML文档就是格式良好的XML文档(Well-FormedXMLDocuments)。开始标签必须要有一个结束标签:在HTML文档中,可以直接使用

,,等标签,而不用加结束标签,在XML中,开始标签和结束标签必须配套,也就是必须写成

...

、...,...  空元素标签必须被关闭.在HTML文档中,可以使用
,
,等单标签,而在XML中,空元素标签必须被关闭。空元素标签采用斜杠(/)来关闭,例如:
,
,所有的标签都区分大小写在HTML文档中,标签是不区分大小写的,和是tr元素的开始标签和结束标签,但是在XML中,和是两个不同的标签,开始标签和结束标签的大小写形式必须一致.所有的标签都必须合理嵌套。在HTML文档中,...是允许的,但是在XML中,这是错误的.在XML中,所有的标签都要成对出现,合理嵌套,正确的形式是:....所有标签的属性值必须用双引号("")或单引号('')括起来。在HTML文档中,属性值可以加引号,也可以不加,例如:都是合法的。在XML文档中,即使是数等字符,也必须加双引号或单引号,例如:。XML有且只能有一个根元素,在HTML中,可以有多个根元素,如下:....
...
.但是在XML中,有且只能有一个根元素,如下:...
XML的编辑工具:.Notepad(Windows自带)、UltraEdit、XMLSpyXML的文档:每一个XML文档都有一个逻辑和一个物理结构。物理上而言,文档由称为实体(entities)的存储单元组成,实体都具有内容并且都通过实体的名字进行标识〔文档实体和外部DTD子集除外)。实体可以是一段文本、一个文件、一个数据库记录或其他包含数据的项目。一个实体可以引用其它的实体,从而将它们包含在文档中。文档开始于"根(root)"或文档实体(documententity).格式良好的XML文档形成了一种层次树结构,而这个树的树根就是文档实体,与其它实体不同,文档实体没有名宇,只是用于表示文档树的根。XML文档的根元素被称为文档元素(documentelement),它和在其外部出现的处理指令、注释等作为文档实体的子节点,而根元素本身和其内部的子元素也是一棵树.实体可以包含已分析(parsed)的或未分析的(unparsed)数据.已分析的数据由字符组成,其中一些字符组成字符数据,另一些字符组成标记。已分析的实体(parsedentity)内容被称为它的替换文本,这个文本被看成是文档整体的一部分.在XML处理器分析XML文档时,凡是文档中出现引用已分析实体的地方,都将被该实体的内容所替换.未分析的实体(unparsedentity)是一种资源,它的内容可以是也可以不是文本,并且,如果是文本的话,可以不是XML文本。每一个未分析的实体有一个相关联的用名字标识的记号(notation)。除了要求XML处理器能向应用程序提供可用的实体和记号的标识符之外,XML对未分析的实体内容不作任何限限制。已分析的实体以实体引用的方式通过名字来调用:未分析的实体通过ENTITY或ENTITIES属性中给出的名字来调用. |逻辑上而言,文档由声明,元素,注释,字符引用和处理指令组成,在文档中,所有这些都是通过显式的标记(markup)来指明的.XML标记(markup)包括开始标签(tag)、结束标签、空元素标签、实体引用、字符引用、注释、CDATA段定界符、文档类型声明,处理指令、XML声明、文本声明以及任何在文档实体顶层的空白(即,在文档元素之外,且不在任何其它的标记内部)。其它所有非标记的文本组成文档的字符数据。XML文档在逻辑上主要由以下五个部分组成。--XML声明--文档类型声明--元素--注释--处理指令。XML声明:XML文档总是以一个XML声明开始,其中指明所用的XML版本、文档的编码、文档的独立性信息。其格式如下一对中括号([])中的部分表示是可选信息。版本声明文档编码声明在XML声明中还可以加上交档编码信息,默认是UTF-8,如果要使用中文,我们可以在声明中加上encoding="gb2312",如下所示:独立文档声明如果我们的文档不依赖于外部文档.在XML声明中,我们可以通过standalone="yes"来声明这个文档是独立的文档,如要文档依赖于外部文档,可以通过standalone="no"来声明。完整的XML声明如下所示:XML声明必须位于文档的第一行,前面不能有任何字符。文档类型声明DTD(DocumentTypeDefinition).文档类型定义.XML从SGML继承了用于定义语法规则的DTD机制,但DTD本身井不要求遵循XML规则,几乎所用的XML应用都是使用DTD来定义的。HTML就有一个标准的DTD文件,所以其组织结构和所有的标签都是固定的.DTD文件也是一个文本文件,通常用"dtd"作为其扩展名.通过文档类型声明,指出XML文档所用的DTD.文档类型声明有两种形式.一种是声明DTD在一个外部的文件中,如下:一种是直接在XML文档中给出DTD,如下:]>元素:在XML中,元素由开始标签、元素内容和结束标签构成,对于空元素,由空元素标签构成。每一个元素有一个用名字标识的类型,同时它可以有一个属性说明集,每一个属性说明有一个名字和一个值。在给元素命名的时候要注意,以"xml"或其他任何匹配(('X'|'x')('M'|'m')('L'|'l'))的字符串开头的名字,被保留用于XML规范的当前版本或后续版本的标准化。此外,在给元素命名时,还要遵守下列规范:1、名称只能以字母、下划线(_)或者冒号(:)开头;2、名称中可以包含字母、数字、下划线以及其它在XML标准中允许的字符;3、名称中不能包含空格;4、名称中尽可能不要使用冒号(:),因为冒号在名称空间中被用于分隔名称空间前缀和本地部分,空元素带有属性的空元素带有内容的元素这是一个学生的信息张三18带有内容和属性的元素18提示:“元素”和“标签”这两个词具有不同的含义。元素是指开始标签、结束标签以及两者之间的一切内容,包括属性、文本、注释以及子元素。标签是一对尖括号(<>)和两者之间的内容,包括元素名和所有属性。例如:是一个标签,也是一个标签:而HelloWorld则是一个元素。元素的内容可以包含子元素、字符数据、字符引用和实体引用、CDATA段。 |子元素本身也是元素,被嵌套在上层元素之内。子元素是相对于父元素而言的,如果子元素还嵌套了其它元素,那么它同时也是父元素。张三18.....在一个元素的内容中,字符数据可以是不包括任何标记的起始定界符和CDATA段的结束定界符的任意字符串,也就是说在元素的内容中,字符数据不能有和号(&)和小于号(<),也不能有字符串"]]>",在CDATA段中,字符数据可以是不包括CDATA段的结束定界符的任意字符串。在字符数据中,不能有和号(&)和小于号(<),因为未经处理的小于号(<)与和号(&)在XML文本中往往被解释为标记的起始定界符(例外的情况见下面要介绍的CDATA段).在XML中,提供了5个预定义的实休引用,分别引用XML文档中的5个特殊字符:小于号(<)、大于号(>)、双引号(")、单引号(')、和号(&)。这5个特殊字符也可以通过字符引用的方式去引用.字符引用和预定义实体引用都是以一个和号(&)开始并以一个分号(;)结束.如果用的是宇符引用,需要在和号(&)之后加上一个井号(#),之后是所需字符的十进制代码或十六进制代码(ISO/IEC10646字符集中字符的编码)。如果用的是预定义实体引用,在和号(&)之后写上宇符的助记符.CDATA段中包含的都是纯字符数据,在字符数据可以出现的任何地方都可以使用CDATA段。CDATA段主要用于需要将整个文本解释为字符数据而不是标记的情况下。CDATA段中的内容不被XML处理器分析,所以可以在其中包含任意的字符。例如,在XML文档中,我需要包含Java代码,而Java代码中可能存在着小于号(<)、大于号(>)、双引号(")、单引号(')、和号(&)这些特殊字符,这个时候,CDATA段就派上用场了。CDATA段以字符串""结束.注释:在XML文档中,注释可以出现在文档中其它标记之外的任何位置,另外,它们还可以在文档类型声明中语法(grammar)允许的地方出现。XML的注释和HTML的注释类似,都是以结束。位于之间的数据将被XML处理器忽略。如:。注释用于对文档中的内容起一个说明作用。使用注释时,要注意以下五点:1、注释不能出现在XML声明之前,XML声明必须是文档最前面的部分。下面的情况是不允许的:2、注释不能出现在标记中,下面的例子是非法的>Hello,world! |3、注释可以包围和隐藏标记,但要注意的是,在注释掉标记之后,要保证剩余的文本仍然是一个结构完整的XML文档。例如:Hello,world!当我们将注释部分去掉的时候,文档结构仍然是完整的:Hello,world!4、字符串"--"(双连字符)不能在注释中出现。下面的例子是非法的。这意味着,我们在注释中书写程序代码的时候,不能出现类似于i--或--i这样的代码。5、在XML中,不允许注释以--->结尾。下面的例子是非法的。处理指令:(ProcessingInstructions,简称PIs)允许文档中包含由应用程序来处理的指令。在XML文档中,有可能会包含一些非XML格式的数锯,这些数据XML处理器无法处理,我们就可以通过处理指令来通知其它应用程序来处理这些数据。处理指令〔PI)的语法和XML声明类似,以结束。一个常见的使用样式表单的处理指令如下所示:在开始标记"default"表示对此元素使用应用程序的缺省空白处理模式,"preserve"指示应用程序保留所有的空白。如果一个元素使用了xml:space属性,将适用于该元素内容中的所有元素,除非被另一个xml:space属性的实例所覆盖。行尾处理:XML数据经常以文本的方式保存在计算机文件中,以行来分隔。然而,不同的计算机系统采用的行分隔符是不同的。在XML空白字符中,有两个是标准的ASCII码行尾控制字符:回车(CR,#xA)和换行(LF,#xD)。Windows平台下,采用#xD#xA的组合作为行分隔符,而Linux,Unix系统则采用#xA作为行分隔符,在MacOS下,采用#xD作为行分隔符。为了简化应用程序的工作,XML处理器在解析前,要将所有的两字符序列#xD#xA,以及单独的#xD字符转换成单个的#xA字符。语言标识: |在文档处理中,标识出其内容所使用的自然或人工语言常常是很有用的。可以在文档中插入一个特殊的属性xml:lang,来指出XML文档中任何元素的内容和属性的值所使用的语言。在有效的文档中,这个属性和其它任何属性一样,在使用时必须声明。xml:lang属性的值是在IETFRFC3066(TagsfortheIdentificationofLanguages)或它的后继版本中定义的语言标识符,另外,也可以为其指定空字符串。例如:ThisisEnglish床前明月光疑是地上霜举头望明月低头思故乡属性xml:lang所指定的语言适用于它所在元素的所有属性及元素的内容,除非被该元素内容中的另一个元素的xml:lang的实例所覆盖。我们可以为一个子元素的xml:lang属性赋一个空值,来覆盖其父元素上的xml:lang属性设置。在该子元素内,将没有可用的语言信息,就好像在它自身及其祖先元素(父元素、父元素的父元素等等)上没有指定xml:lang属性一样。xml:lang的一个简单声明可以采用如下形式:xml:langNMTOKEN#IMPLIED不过,如果合适的话,也可以给出指定的缺省值。在一本供英国学生使用的法文诗歌集中,注解(gloss)和笔记(note〕使用英语,xml:lang属性可以声明如下:格式良好的XML:如果一个XML文档有且只有一个根元素,符合XML元素的嵌套规则,满足XML规范中定义的所有格式正确性的约束,并且在文档中直接或间接引用的每一个已分析实休都是格式正确的,我们称这个文档是一个格式良好(well-formed)的XML文档。为什么格式良好的XML是如此重要呢?主要是因为:1、可以创建没有DTD的XML文档,便于利用XML文档做数据的交换。2.XML的处理器可以做得很小很快,从而应用于手持设备,例如:PDA、手机等存储容量较小的设备中。DTD在XML文档中引入DTD:DTD(DocumentTypeDefinition),文档类型定义。在XML标准中,描述了如何创建DTD,以及如何将它与根据它的规则所编写的XML文档相关联,并且还定义了XML处理器应该如何对DTD进行处理。有了DTD就可以检测XML文档的结构是否正确。DTD为XML文档的编写者和处理者提供了共同遵循的原则,使得与文档相关的各种工作有了统一的标准。通过在XML文档中包含文档类型声明,来建立当前文档和DTD的关联。当进行有效性验证的XML处理器读到该指令时,它获取DTD.并根据其中定义的规则对文档进行检验。文档类型声明必须位于XML声明之后,且在根元素(文档元素)之前。不过,在XML声明和文档类型声明之间可以插入注释和处理指令。我们可以直接在XML文档中定义DTD,也可以通过URI引用外部的DTD文件,或者同时采用这两种方式。]>文档类型声明由结束。在DTD中,所有的关键宇都是大写的。不过,在DTD中定义的元素和属性的大小写是可以任意指定的,但是要注意,因为XML文档是大小写相关的,所以一旦给一个元素命名,那么在整个文档中要使用相同的大小写.例如:greeting和Greeting是两个不同的元素名。在XML文档中定义DTD,比较直观,修改也比较方便,而且不用担心XML处理器找不到DTD,但是它也有一些缺点:(1) |在文档中定义DTD会导致文档本身的长度增加,在传输数据时,即使不需要验证文档的有效性,这些声明也会随着文档一起传输;(2)如果多个XML文档要共用同一个DTD,我们就需要在每一个文档中加入DTD,这是相当繁琐的。在文档类型声明时,用关键字SYSTEM或PUBLIC来指出外部DTD文件的位置。使用SYSTEM关键字的声明语法如下:SYSTEM关键字表示文档使用的是私有的DTD文件,“外部DTD文件的URI"可以是相对URI或者绝对URI.相对URI是相对于文档类型声明所在文档的位置。"外部DTD文件的URI"这部分也被称为系统标识符(systemidentifier).下面是使用一个外部DTT文件的例子:如果位于不同位置的多个XML文档要使用同一个DTD.我们可以使用绝对URI来指明DTD文件的地址。假定hello.dtd位于http://www.sunxin.org/xml/dtds/hello.dtd.可以在文档类型声明中使用此URI:如果引用DTD的XML文档与DTD文件在同一个Web服务器上,我们也可以使用相对URL:上面的三种形式都是允许的。使用PUBLIC关键字的声明语法如下:PUBLIC关键宇用于声明公共的DTD,并且这个DTD还有一个名称,"DTD的名称”也称为公共标识符(publicidentifier).这个DTD可以存放在某个公共的地方,XML处理程序会根据名称按照某种方式去检索DTD,如果XML处理器不能根据名称检索到DTD,就会使用"外部DTD文件的URI"(系统标识符)来查找该DTD。DTD名称与XML名称略有不同,它们只能包含ASCII字母和数字字符、空格、回车符、换行符和一些标点符号:-'()+,./:=?;!*#@$_%公共DTD名称要遵守一些约定。如果一项DTD是ISO标准,它的名称要以字符串"ISO"开始。如果是一个非ISO的标准组织批准的DTD,它的名称以加号(+)开始。如果不是标准组织批准的DTD.它的名称以连宇符(-)开始.这些开始字符或字符串后接双斜杠(//)和DTD所有者的名字,之后是另一个双斜杠和DTD描述的文档类型,接着又是一个双斜杠后接ISO639语言标识符,如EN表示英语,ZH表示中文.在http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt处列有完整的ISO639标识符。例如我们定义的人力资源DTD可以采用下面的命名:-//xinsun//DTDHR1.0//ZH连字符(-)表示这个DTD不是由任何标准组织批准的,为xinsun所有,描述的是人力资源管理,用中文编写。完整的文档类型声明如下:HTML网页的文档类型声明,如下:W3C公布的在Web文档中使用的有效的文档类型声明列表可以在http://www.w3.org/QA/2002/04/valid-dtd-list.html上找到.注意:文档类型声明与文档类型定义不是一个概念,DTD是文档类型定义(DocumentTypeDefinition)的英文缩写。是文档类型声明, |这种语法是文档类型定义。文档类型声明可以包含(内部DTD子集)或引用(外部DTD子集)一个文档类型定义,但文档类型定义从不包含文档类型声明.在前面我们提到,如果我们的文档不依赖于外部文档,在XML声明中,可以通过standalone="yes"来声明这个文档是独立的文档。如果文档依赖于外部文档,可以通过standalone="no"来声明。当我们使用外部DTD文件时,就需要将属性standalone的值设置为"no"。在实际应用中,很少使用standalone属性,它的主要用途是作为XML处理器和其它应用程序的标志,表示是否需要获取外部内容。如果文档依赖于外部文档,即使我们不使用standalone属性,XML处理器也能够很好地进行处理。DTD的结构:DTD的结构一般由元素类型声明、属性表声明、实体声明、记号(notation)声明等构成。一个典型的文档类型定义文件会把将来所要创建的XML文档的元素结构、属性类型、实体引用等预先进行定义。元素类型声明不但说明了每个文档中可能存在的元素,给出了元素的名称,而且给出了元素的具体类型。一个XML元素可以为空,也可以只包含字符数据,还可以有若干个子元素,而这些子元素同时又可以有它们的子元素。元素类型声明采用如下的语法格式:元素内容说明可以指明五种可能的元素内容形式:#PCDATA、子元素、混合内容、EMPTY和ANY.关键字#PCDATA说明元素包含字符数据。例子:]>
人力资源标准当一个元素只包含子元素,而没有字符数据时,则称此元素类型具有元素型内容(elementcontent)。在该类型的元素声明时,通过内容模型来指定在其内容上的约束。内容模型是决定子元素类型和子元素出现顺序的一种简单语法。利用括号、逗号、竖线、星号、加号、问号的组合,可以说明很复杂的内容模型。我们看下面的例子:这说明简历中要有名字,接下来是性别和年龄,电话和手机任选一个,可以填一个家庭住址或者不填,然后是零个或多个兴趣爱好,至少要有一个教育经历,最后是零个或多个工作经验。内容模型的规则虽然简单,但是可以产生灵活多样的结构。说明元素既可以包含字符数据,也可以包含子元素。混合内容必须被定义零个或多个。例子:]>员工信息张三在使用混合内容模型时,#PCDATA关键字必须是模型中的第一个选项,不能在模型中使用逗号、问号和加号。用竖线分隔的#PCDATA和元素的列表是合法的,其它用法都是不合法的。关键字EMPTY表明该元素既不包含字符数据,也不包含子元素,是一个空元素。如果在文档中元素本身已经表示了明确的含义,就可以在DTD中用关键字EMPTY来声明空元素。例如:表明br是一个没有内容的空元素。关键宇ANY表明该元素可以包含任何的字符数据和子元素,只要它们不违反XML格式良好的约束就可以了。例如: 表明employee可以包含任何形式的内容。在实际使用时,应该尽量避免使用ANY,一个定义明确的DTD,有助于我们理清文档的结构,更好地理解文档。实体声明:有两种类型的实体:一般实体(generalentity)和参数实体(parameter |entity)。一般实体是在文档内容中使用的实体,而参数实体则是在DTD中使用的已分析实体。不管是一般实体,还是参数实体都是用ENTITY关键字来声明。一般实体的声明语法如下:引用实体的方式为:"&实体名;".参数实体只能在DTD中使用,它的声明语法如下:注意在声明时,ENTITY、%和实体名之间各有一个空格。引用实体的方式为:"%实体名;"。在内部DTD子集中,参数实体引用不能在标记声明内部出现,可以在标记声明允许出现的地方出现。对于外部DTD子集,则没有这个限制。在DTD中,所有的参数实体必须在引用之前进行声明。这意味着内部DTD子集不能引用在外部DTD中声明的参敌实体,这是因为XML处理器将首先读取内部子集,也就是说,内部子集中的实体和属性表声明的优先级要比在外部子集中的高。内部实体在XML文档内部定义,实体的内容在声明中给出。内部实体都是已分析的实体,它们没有单独的物理存储对象。外部实体在单独的(外部)文件中定义,外部实体可以是已分析实体,也可以是未分析实体。外部一般实体的声明形式如下:关键字SYSTEM表明这是一个私有的外部一般实体,后口的URI称为该实体的系统标识符,用于给出外部文件的位置。copyright.xml文件的内容为:©2004,程序员之家,ALLRightsReserved称为文本声明。文本声明类似于XML声明,不过文本声明没有standalone属性,并且version属性也是可选的。外部已分析实体可以使用不同于UTF-8的编码,使用文本声明来指明实体内容的编码方式。每个外部已分析实体都应该以文本声明开始,文本声明只能在外部已分析实体的开头出现,不能出现在其它任何位置。在外部已分析实体中的文本声明不会作为替换文本的一部分而出现。也可以使用PUBLIC关键字来声明公共的外部一般实体,其声明形式和使用了关键字PUBLIC的外部DTD声明类似。如下:-//Textuality//TEXTStandardopen-hatchboilerplate//EN"称为该实体的公共标识符,后面的URI部分为该实体的系统标识符。下面的例子声明了一个外部一般未分析实体.元素名是属性所属的元素的名字,属性名是属性的命名,属性类型则用来指定该属性是属于哪种类型,共有十种类型,缺省声明用于说明在元素中该属性是否必须出现,如果不是必须出现,那么当该属性没有出现时,XML处理器应该如何处理。缺省声明可以有四种缺省设置,#REQUIRED、#IMPLIED、#FIXED+缺省值、只有缺省值。#REQUIRED关键字REQUIRED说明必须为元素提供该属性。#IMPLIED关键字IMPLIED说明元素可以包含该属性,也可以不包含该属性。#FIXED+缺省值 |关键字FIXED+缺省值,说明一个固定的属性缺省值,文档的编写者不能修改该属性的值。如果元素中不包含这个属性,XML处理器将以声明的缺省值向应用程序报告该属性。只有缺省值与FIXED+缺省值一样,如果元素不包含该属性,XML处理器将以声明的缺省值向应用程序报告该属性。不同的是,这种声明方式属性的值是可以改变的。在属性表声明时,总共有十种属性类型可以选择,分别是:CDATA,Enumerated、ID、IDREF、IDREFS、ENTITY、ENTITIES、NMTOKEN、NMTOKENS、NOTATION。CDATA这是最常用的一种属性类型,表明属性值为字符数据,与元素内容说明中的#PCDATA相同。如果属性值需要出现小于号(<)和双引号("),可以通过预预定义实体引用或字符引用的方式插入小于号和双引号。如果包含的和号(&)不是字符或实体引用的起始定界符,也必须使用预定义实体引用或者字符引用的方式插入。Enumerated在声明属性时,可以限制属性的取值只能从一个列表中选择,这类属性属于枚举类型。枚举类型的属性有时候是很有用的,例如:person元素有一个sex属性,我们希望这个属性的取值只能是male或female,在声明属性时,将这两个值放到圆括号中,井用竖线(|)分隔,如下所示:列表中的可选属性值,不用加双引号(")或单引号('),但是在给属性赋值时,需要带上双引号或单引号.另外要注意的是,在给属性赋值时,不仅必须使用枚举类型声明中的可选值.而且还要注意属性值的大小写,Male,MALE,Female,FEMALE等都是无效的。ID、IDREF、IDREFS一个ID类型的属性值唯一标识XML文档中的一个元素。一个ID类型的属性值必须遵守XML名称定义的规则,以字母、下划线或冒号开头,名称中可以包含字母、数字、下划线以及其它在XML标准中允许的字符,名称中不能带有空格。一个元素只能有一个ID类型的属性,ID类型的属性必须设置为#IMPLIED或者#REQUIRED,因为ID类型属性的每一个取值都是用来标识一个特定的元素,为ID类型的属性提供缺省值,特别是固定的缺省值是毫无意义的。]>张三李四IDREF类型的属性值为同一文档中另一个元素的ID类型的属性值,而这另一个元素的ID类型的属性值必须是已经存在的。利用ID和IDREF这两种类型的属性,我们可以在两个对象之间建立一种关联关系。]>张三李四 |]>张三李四王五如果一个属性需要引用文档中多个ID类型的属性值,那么可以把它声明为具有IDREFS类型。IDREFS类型的属性值是一系列以空格分隔的ID类型的属性值,而且必须与文档中已有的ID类型属性值相匹配。]>XML详解Servlet从入门到精通JSP实例编程2004-03-142004-05-08ENTITY、ENTITIESENTITY类型的属性把外部的二进制数据链接到文档,ENTITY类型的属性值是在DTD中声明的未分析的一般实体的名称。例如,我想在文档中包含一幅外部的图像,可以声明一个ENTITY类型的属性来引入图像,如下:在DTD中,还需要声明一个外部的一般实体:关键字NDATA表示该实体是一般未分析的实体,后面的gif是记号名称(notationname),说明实体的数据格式或指定-个外部的处理程序,记号gif的声明如下:在XML文档中,可以把src属性中引用图像: 这句代码将http://www.sunxin.org/logo.gif文件与image元素关联在一起。ENTITIES类型和IDREFS类型的使用是类似的,它的值是多个以空格分隔的ENTITY类型的属性值。例如,我们可以再添加一个实休声明:然后将元素image的属性声明改为:在XML文档中,通过src属性引用两幅图像:NMTOKEN、NMTOKENSNMTOKEN(nametoken),名称标记是任何命名宇符的混合体.NMTOKEN类型的属性值是受限制的文本,只能包含名称字符,不能包含空白字符. |XML名称不能以除字母、下划线和冒号之外的其它字符开头,而名称标记没有这个限制。所有的XML名称都是名称标记,但不是所有的名称标记都是XML名称.为了限制文件名属性的取值不能有空格,我们可以采取如下的属性声明方式:在文档中,可以按如下方式使用name属性:NMTOKENS类型与IDREFS和ENTITIES类似,它的值由多个名称标记构成,每个名称必须是有效的名称标记,它们之间以空格分隔。例如在DTD中声明:在文档中使用:有时候,你可能会用NMTOKEN类型的属性来让用户输入特定的值,但是要注意的是:在使用NMTOKEN类型的属性时,其值是否有效,需要文档的作者自己去保证,XML处理器只能确保名称是合法的(也就是检查名称中有没有空格),而不会检查值的有效性。NOTATIONNOTATION类型属性的值就是在记号声明中的名称。]>http://www.sunxin.org/images/photo.jpg记号声明:在现实中,有很多数据都是无法用XML来表示的,例如:声音、图像、影像等,对于这些数据,XML处理器通常都不支持。通过DTD中的记号声明(notationdeclaration),为非XML数据描述一种可能的格式,或者指定一个外部的处理程序。记号声明有两种形式,一种是使用MIME类型,形式如下:另一种是使用URI路径,指出外部处理程序的位置,如下:对于记号的声明,也可以使用PUBLIC关键字来代替SYSTEM关键字,并添加公共的名称和URI(用法类似于使用了关键字PUBLIC的外部DTD声明)。有效的XML:一个遵守XML语法规则,并遵守相应DTD文件约束的XML文档称为有效的XML文档。注意区分格式良好的XML和有效的XML,一个只要求遵循XML规范,一个不但要遵循XML规范,还要遵循相应的DTD约束。将XML文档和它的DTD文件进行比较分析,看是否符合DTD规则的过程叫验证(validation),这个过程通常是通过一个支持有效性检查的XML处理器来完成的。XML处理器/解析器:合乎规范的XML处理器可以分为两类:进行验证的和不进行验证的。不支持有效性检查的处理器:这一类处理器只负责检查XML文档和它内部的DTD子集是否满足“格式良好的”语法规定。这类处理器不会对XML文档所引用的外部DTD文档进行分析、进而检查XML文档的有效性,但对于出现在文档内部的DTD子集,仍旧需要处理在内部DTD子集和参数实体中读取到的所有声明,直到发现第一个对它们没有读取到的参数实体的引用。也就是说,这类处理器必须使用DTD声明中的信息来规范属性的值,包含内部实体的替换文本,以及提供缺省的属性值。 |支持有效性检查的处理器:这一类处理器在检查文档是否符合"格式良好的"基本要求的基础上,进一步结合DTD检查文档是否符合DTD中对文档结构的规定,判定这个文档是否是"有效的"。处理器必须读取和处理整个DTD和文档中引用的所有外部已分析实体。并报告出文档与DTD声明相冲突的地方,以及不满足DTD有效性约束的地方。无论是哪一类处理器,都要报告文档实体的内容中和其它读取到的已分析实体中与XML标准的"格式良好的"文档定义相冲突的地方。支持对XML文档进行有效性检查的XML处理器有:Apache的Xerces:Xerces是Apache的XML项目的一部分,它分别使用Java、C++和perl编写了XML的处理器,支持有效性检查。Xerces是一个开放源代码的XML处理器,有关该处理器的详细介绍请参看网页:http://xml.apache.org/xerces-j/index.html。OracleXMLParser:OracleXMLParser是在OracleXDK(XMLDevelopersKit)中提供的。XDK是Oracle公司提供的基于XML的工具包,可以用于Java、C++和PL/SQL。OracleXDK一个商业化软件,并非开放源代码产品。Oracle公司发布了用于开发的许可证,允许你将此软件用于开发目的。可以从下面的网页查看XDK的信息:http://www.oracle.com/technology/tech/xml/xdkhome.htmlXMLA处理器位于XML数据与使用XML数据的应用程序之间,它通过标准的API来向应用程序提供数据。小结:XML部分:XML主要用于表示数据,其对格式的要求比HTML更加严格。XML文档的逻辑结构主要包括XML声明、文档类型声明、元素、注释和处理指令几个部分。如果一个文档符合XML规范中定义的所有格式正确性的约束,并且在文档中直接或间接引用的每一个己分析实体都是格式正确的,我们称这个文档是一个格式良好的XML文档。一个遵守XML语法规则,并遵守相应DTD文件规范的XML文档称为有效的XML文档。DTD部分:对于一个格式良好的XML文档,我们只能保证这个文档的格式符合XML规范,但是元素与元素的关系、元素与属性的关系,属性的取值是否正确,就需要通过DTD来进行验证了。在XML文档中引入DTD,可以直接在XML文档中包含DTD,也可以通过URI引用外部的DTD文件,或者同时运用这两种方式。DTD的结构一般由元素类型声明、属性表声明、实体声明、记号声明等构成。一个典型的DTD文件会把将来所要创建的XML文档的元素结构、属性类型、实体引用等预先进行规定。第2章XML名称空间声明名称空间:一个XML文档中可以包含许多元素与属性,当我们使用其他人的XML文档,或者在文档中使用多个DTD文件时,就有可能碰到名称相同的元素,而这些名称相同的元素可能代表了完全不同的含义。比如:title可以用于表示标题,也可以用于表示某个人的头衔;table可以用于表示表格,也可以用于表示桌子。当这些具有相同名称不同含义的元素混合到一个文档中时,就会造成理解和处理上的混乱。为了解决这个问题,就要用到W3C发布的另一个推荐标准—XML名称空间。可以在http://www.w3.org/TR/REC-xml-names/上查看XML名称空间规范的详细内容。名称空间通过使用一系列的保留属性来声明,这种属性的名字必须是以xmlns或以xmlns:作为前缀。与其它任何XML属性一样,这些属性可以直接或以缺省的方式给出。第一种形式:<元素名xmlns:prefixname="URI"> |元素名是指你在哪一个元素上声明名称空间,在这个元素上声明的名称空间适用于声明它的元素和属性,以及该元素内容中所有元素及其属性。xmlns:prefixname作为该元素的属性名,属性的值是一个URI引用,是标识该名称空问的名称空间名宇。共中prefixname给出名称空间前缀的名字,该前缀用于将元素及属性的名字与URI关联在一起。要注意的是,在这样的声明中,名称空间的名宇不能为空("")。如果有两个URI,其组成字符完全相同,可以认为它们标识了同一个名称空间。来自于XML名称空间的名字可以作为限定名(qualifiednames)出现,限定名包含了一个以冒号(:)分隔的名称空间前缀和一个本地部分(localpart)。映射到URI引用的名称空间前缀选择了一个名称空间。例子:名称空间前缀可以是不包含冒号的任何合法的XML名称。在声明名称空间时,有两个前缀是不允许使用的,它们是xml和xmlns。xml前缀只能用于XML1.0规范中定义的xml:space和xml:lang属性,前缀xml被定义为与名称空间名字http://www.w3.org/XML/1998/namespace绑定。前缀xmlns仅仅用于声明名称空间的绑定,它被定义为与名称空间名宇http://www.w3.org/2000/xmlns/绑定。提示:名称空间推荐标准中指出,在名称空间声明中,使用相对URI引用已经被废弃了(不赞成使用)。第二种形式:<元素名xmlns="URI">这种声明形式没有给出名称空间的前缀名,URI所标识的是缺省的名称空间。在这样的缺省声明中,属性值可以为空("")。例子:表示声明了一个缺省的名称空间,hr元素及其内容中所有的没有前缀的元素都属于http://www.sunxin.org/hr所标识的名称空间,除非被hr元素内容中其它的缺省名称空间声明所覆盖。注意:在声明名称空间时,选择的URI不需要指向实际的内容,在URI所标识的位置上,可以不存在任何东西。在名称空间声明中的URI,只是形式上的标识符,其唯一的目的是提供一个唯一的名字。名称空间在元素和属性中的运用:在具有很多元素(这些元素都在同一个名称空间中)的文档中,给每个元素名称都添加一个前缀将是一件繁琐的事情。因此,我们可以使用没有前缀名的xmlns属性将缺省的名称空间附加给元素及其子元素,元素本身及其子元素都被认为是在缺省的名称空间中,除非它们有明确的前缀。缺省名称空间声明中的URI可以设为空字符串,这样的话,在它的声明范围内,没有前缀的元素将被认为不存在于任何的名称空间中,这和没有声明缺省名称空间是一样的。一个属性要想在某个名称空间中,必须给该属性加上名称空间的前缀,没有前缀的属性不在任何的名称空间中(包括缺省的名称空间)。即使拥有属性的元素在某个名称空间中,没有前缀的属性仍然不在该名称空间或任何其它的名称空间中。在XML文档中,没有任何一个标签可以包含两个相同的属性,所谓相同有两种情况,一种是属性的名字完全相同,另一种是属性限定名中的本地部分完全相同,而不同的前缀绑定到了相同的名称空间名字。xmlns=”http://www.w3.org”>间也不例外--> |名称空间和DTD:DTD和名称空间并不相关,当XML处理器在验证文档的有效性时,根本不管元素前缀的含义,只是按照DTD的规范对文档进行有效性验证。我们在声明名称空间时,使用了xmlns或xmlns:prefixname属性,而在验证时,会发现在DTD中没有声明该属性,当然验证就会失败;另外,如果在DTD中声明的是book元素,而在文档中使用的是bks:book元素,则文档也是无效的。为了让使用名称空间的文档有效,我们必须在DTD中像声明其它属性一样声明xmlns或xmlns:prefixname属性,此外,还需要重写所有带有前缀的元素和属性的声明。没有使用名称空间的文档应用了名称空间后,要重写DTD]>]>JSP编程张三JSP编程张三小结:为了解决多个XML文档命名冲突的问题.可以利用W3C发布的另一个推荐标堆-XML名称空间。在声明名称空间时,选择的URI不需要指向实际的内容.在URI所标识的位置上,可以不存在任何东西.在名称空间声明中的URI,只是形式上的标识符,其唯一的目的是提供一个唯一的名字,在名称空间声明时,不能使用相对URI,而要使用绝对URI。来自于XML名称空间的名字可以作为限定名(qualifiednames)出现,限定名包含了一个以冒号(:)分隔的名称空间前缀和一个本地部分,要注意.没有冒号的名字也可以是限定名。缺省名称空间声明中的URI可以设为空字符串,在声明范围内,没有前缀的元素将被认为不存在于任何的名称空间中。一个属性要想在某个名称空间中,必须给该属性加上名称空间前缀,没有前缀的属性不在任何的名称空间中(包括缺省的名称空间),即使拥有属性的元素在某个名称空间中,没有前缀的属性仍然不在该名称空间或任何其它的名称空问中第3章对XML文档进行分析内容*介绍DOM、SAX和JAXP*使用DOM解析XML文档*使用SAX解析XML文档*使用JDOM解析XML文档*使用dom4j解析XML文档*解析名称空间 |DOM.、SAX和JAXPDOM是DocumentObjectModel的缩写,即文档对象模型,它是W3C组织推荐的处理XML的标准接口。2004年4月7日,W3C组织发布DOMLevel3Core的推荐标准,有关DOM的技术报告可以在http://www.w3.org/DOM/DOMTR.html上查看。SAX是SimpleAPIforXML的缩写,它是由XML-DEV邮件列表的成员开发的,目前的版木是2.0.x。SAX不是某个官方机构的标准,也不由W3C组织或其它任何官方机构维护,但它是XML社区事实上的标准。虽然SAX只是"民间"的标准,但是它在XML中的应用丝毫不比DOM少,几乎所有的XML解析器都支持它。可以在http://www.saxproject.org/上获得更多的有关SAX的资料。Apache的Xerces是一个使用非常广泛的解析器,它提供了DOM和SAX的调用接口,并有多种语言的实现版本。要利用Xerces访问XML文档,只需要在应用程序中构造一个解析器实现类的对象,例如,SAX定义的解析器接口是:org.xml.sax.XMLReader,Xerces中提供的实现类是:org.apache.xerces.parsers.SAXParser,在应用程序中可以采用如下的方式访问XML文档:org.xml.sax.XMLReadersp=neworg.apaehe.xerces.parsers.SAXParser();FileInputStreamfis=newFileInputStream("Students.xml");InputSourceis=newInputSource(fis);sp.setContentHandler(newMyContentHandler());sp.parse(is);为了屏蔽具体厂商的实现,让Java开发人员以一种标准的方式对XML进行编程,Sun公司制定了JAXP(JavaAPIforXMLProcessing)规范。JAXP没有提供解析XML的新方法,也没有为XML的处理提供新功能,它只是在解析器之上封装了一个抽象层,允许开发人员以独立于厂商的API调用访问XML数据。从JAXP1.1开始,JAXP就成为了J2SE(Java2StandardEdition)和J2EE(Java2EnterpriseEdition)的一部分。JAXP1.1包含在J2SE1.4和J2EE1.3中,目前JAXP的最新版本1.3包含在J2SE5.0即(JDK1.5)和J2EE1.4中。JAXP开发包由javax.xml包及其子包、org.w3c.dom包及其子包、org.xml.sax包及其子包组成。在javax.xml.parsers包中,定义了几个工厂类,用于加载DOM和SAX的实现类。JAXP是由接口、抽象类和一些辅助类组成,符合JAXP规范的解析器实现其中的接口和抽象类,开发人员只要使用JAXP的API编程,底层的解析器就可以任意切换。DOM结构模型:DOM是独立于程序设计语言的,W3C组织以IDL(Interface |Definition Language.接口定义语言)的形式定义了DOM中的接口。某种程序语言要实现DOM,需要将DOM接口转换为本语言中的适当结构,为了保证不同语言的不同的DOM之间实现广泛的兼容,W3C组织在DOM规范的附录部分提供了Java和ECMAScript这两种语言的语言绑定。DOM中的核心概念就是节点.DOM在分析XML文档时,将组成XML文档的各个部分(元素、属性、文本、注释、处理指令等等)映射为一个对象,这个对象就叫做节点。在内存中,这些节点形成一棵文档树。整棵树是一个节点,树中的每一个节点也是一棵树(子树),可以说,DOM就是对这棵树的一个对象描述。我们通过访问树中的节点来存取XML文档的内容.DOM解析器工厂:在javax.xml.parsers包中,定义了DOM解析器工厂类DocumentBuilderFactory,用于产生DOM解析器。使用javax.xml.parsers.DocumentBuilderFactory系统属性:第一种方式:System.setProperty("javax.xml.parsers.DocumentBuilderFactory","org.apache.xerces.jaxp.DocumentBuilderFactorylmpl");第二种方式:java-Djavax.xml.parsers.DocumentBuilderFactory=oracle.xml.jaxp.JXDocumentBuilderFactoryDOMTest在JAXP的早期的版本中,除了JAXPAPI外,还包含了一个叫做Crimson的解析器。从JAXP1.2开始,Sun公司对Apache的Xerces解析器重新包装了一下,并将org.apache.xerces包名改为了com.sun.org.apache.xerces.internal,然后在JAXP的开发包中一起提供,作为缺省的解析器。我们所使用的JDK1.5中包含的缺省解析器就是被重新包装过后的Xerces解析器。可以从http://xml.apache.org/xerces2-j/上下载Apache的Xerces解析器.此外,还有一种方式可以替换JDK中提供的缺省XML解析器,那就是使用认可的标准覆盖机制(EndorsedStandardsOverrideMechanism),JDK1.4及后续版本的JDK都支持这种机制。一个认可的标准(endorsedstandard)是通过一个标准进程(并非JCP)来定义的JavaAPI。提供认可的标准覆盖机制,主要是为了让软件开发人员或软件提供商可以使用新版本的API来替换JDK所提供的API版本。当然,JDK中并不是所有的API都可以被替换,只有那些被认可的标准API可以被替换。为了替换JDK中提供的缺省XML解析器,需要在JRElib目录下创建endorsed子目录,然后将包含解析器实现类的JAR包复制到endorsed目录下,对于Xerces解析器,直接将xerceslmpl.jar文件夏制到JRElibendorsed目录下即可。或者,你可以通过设置系统属性java.endorsed.dirs,来指定另外的路径。假定xerceslmpl.jar在D:xerces-2_7_1目录下,在执行程序时,可采用如下命令:java-Djava.endorsed.dirs=D:xerces-2_7_1DOMTestJCP(JavaCommunity |Process)是一个开放的国际组织,主要由Java开发者以及被授权者组成,其职能是发展和更新Java技术规范、参考实现(RI)和技术兼容包(TCK)。JCP的专家组成员一般都是业界比较有影响力的企业或者组织.JCP的原创者是SUN公司,不过现在的JCP已经由原先的非正式过程,演进到如今有数百名来自世界各地Java代表成员一同监督Java发展的正式程序.JCP维护的规范包括J2ME,J2SE,J2EE等。组织成员可以提交JCR(JavaSpecificationRequests),也就是Java规范请求,在通过特定程序以后,进入到下一版本的规范里面。DOM树中的节点类型:DOM本质上是节点的集合。由于一个文档中可能包含不同类型的信息,因此要定义不同类型的节点。XML中最常见的节点类型是:文档、元素、文本、属性,其它不常用的节点类型包括:注释、处理指令、文档类犁、CDATA段、文档片段、实体、实体引用、记号。文档节点是文档树的根节点,也是文档中其它所有节点的父节点。要注意的是,文档节点井不是XML文档的根元素,因为在XML文档中,处理指令、注释等内容可以出现在根元素以外,所以在构造DOM树时,根元素并不适合作为根节点,于是就有了文档节点,而根元素则作为文档节点的子节点。在DOMAPI中,文档节点是通过org.W3c.dom.Document接口来表示的。元素节点是组成文档树的重要部分,它表示了XML文档中的元素。通常,元素拥有子元素、文本节点,或两者的组合。元素节点也是唯一能够拥有属性的节点类型。在DOMAPI中,元素节点是通过org.w3c.dom.Element接口来表示的。文本节点是只包含文本内容(在XML中称为字符数据)的节点,它可以由更多信息组成,也可以只包含空白。在文档树中,元素和属性的文本内容都是由文本节点来表示的。在DOMAPI中,文本节点是由org.w3c.dom.Text接口来表示的.Text接口继承自CharacterData接口。文本节点可以只包含空白,因此如果元素的内容中包含空白,那么该元素节点的子节点中,也将包含以空白组成的文本节点。例如,下面的元素:张三18属性节点代表了元素中的属性。在DOMAPI中,属性节点是通过org.w3c.dom.Attr接口来表示的。因为属性实际上是附属于元素的,所以属性节点不能被看作是元素的子节点,因而在DOM中,属性没有被认为是文档树的一部分,在属性节点上调用getParentNode()、getPreviousSibling()和getNextSibling()方法返回的都将是null.换句话说,属性节点其实是被看作包含它的元素节点的一部分,它并不作为单独的一个节点在文档树中出现。注释节点表示注释的内容。在DOMAPI中,注释节点是通过org.w3c.dom.Comment接口来表示的,Comment接口继承自CharacterData接口。处理指令节点表示XML文档中的处理指令。在DOMAPI中,处理指令节点是通过org.w3c.dom.Processinglnstruction接口来表示的。在DOMAPI中,文档类型节点是通过org.w3c.dom.DocumentType接口来表示的。每一个Document都有一个doctype属性,其值或者是null或者是DocumentType对象。DOMCore中的DocumentType接口为DTD中声明的实体列表和记号(notation)提供了一个接口。CDATA段节点表示XML文档中的CDATA段。在DOMAPI中,CDATA段节点是通过org.w3c.dom.CDATASection接口来表示的,CDATASection接口继承自Text接口。在DOMAPI中,文档片段节点是通过org.W3c |.dom.DocumentFragment接口来表示的。文档片段是“轻量级的”或"最小的"Document对象。DocumentFragment对象和Document对象的主要区别是:DocumentFragment可以不是格式良好的,例如,包含多个顶层节点(形成了树林),也可以只包含一个Text子节点。可以通过移动文档的片段来重新排列文档。要注意的是,当把DocumentFragment对象插入到Document(或任何其它可以带有子节点的Node)中时,是DocumentFragment的子节点而不是DocumentFragment本身被插入到Node中。这使得DocumentFragment对用户创建兄弟节点非常有用,此时DocumentFragment作为这些节点的父节点,用户可以使用Node接口的标准方法,例如insertBefore()和appendChild()进行操作。实体节点表示一个在XML文档中已分析的或未分析的实体。注意,实体模型本身并不是实体的声明。在DOMAPI中,实体节点是通过org.w3c.dom.Entity接口来表示的。实体引用节点可以被用于表示DOM树中的一个实体引用。注意,XML文档中的字符引用和预定义实体引用将被XML解析器扩展,以等价的Unicode码来表示,而不是用实体引用来表示。在DOMAPI中,实体引用节点是通过org.W3c.dom.EntityReference接口来表示的。记号节点表示了在DTD中声明的记号。在DOMAPI中,记号节点是通过org.w3c.dom.Notation接口来表示的。org.W3c.dom.NodeList接口提供了一个有序节点集合的抽象。在这个接口中定义了下面的两个方法:intgetLength()该方法返回列表中节点的数目。Nodeitem(intindex)返回集合中指定索引的节点。集合中的索引从0开始。要注意的是,DOM中的NodeList对象是动态的(live)。例如,你使用Node接口中的getChildNodes()方法得到一个节点的子节点列表,然后你调用insertBefore()、appendChild()、replaceChild()或removeChild()等任何一个方法,都将影响到NodeList对象,也就是说,当你再次调用getLength()和item()方法时将返回与先前不同的值。理解这一点很重要,特别虽当你迭代包含子节点的节点列表以插入或删除节点时更是如此。org.w3c.dom.NamedNodeMap接口也是一个节点的集合,通过该接口,可以建立节点名和节点之间的一一映射关系,从而利用节点名就可以直接访问对应的节点。不过要注意,NamedNodeMap接口并不是从NodeList接口继承而来,而且它其中的节点并没有以任何特定的次序来维护。尽管这些节点也可以通过索引来访问,但这只是提供了枚举NamedNodeMap中所包含节点的一种简便方法,并不是表明在DOM规范中为NamedNodeMap中的节点规定了一种排列顺序。NamedNodeMap表示的是一组节点和其唯一名字一一对应关系,这个接口主要用在属性节点的表示上.例如.在某个元素节点上调用getAttributes()方法,将返回一个包含属性名和属性节点映射的NamedNodeMap对象。与NodeList相同,在DOM中,NamedNodeMap对象也是动态的(live)。例如,你在一个Element对象上调用getAttributes()方法,得到一个NamedNodeMap对象,然后在该Element对象上调用setAttribute()或removeAttribute()方法添加或删除一个属性,都将影响到NamedNodeMap对象。Eclipse介绍 |:Eclipse是一个开放源代码的、基于Java的可扩展的开发平台。大多数的人都是将Eclipse作为Java的集成开发环境使用,虽然Eclipse是使用Java语言开发的,但Eclipse不仅仅可以用于Java的开发,它还可以用于其它语言的开发,例如C/C++。Eclipse它只是一个框架和一组服务,它通过各种插件来构建开发环境,因此只要提供支持C/C++或其它编程语言的插件,Eclipse就可以作为这些语言的集成开发环境。Eclipse最早是由IBM开发的,后来,IBM将Eclipse作为一个开放源代码的项目发布。现在Eclipse在Eclipse.org协会的管理与指导下开发。用DOM解析XML文档实例:第1个实例:DOMStudentslnfo.java第2个实例:DOMPrinter.java第3个实例:DOMConvert.java第4个实例:DocTypePrinter.java****seevideo****使用SAX解析XML文档SAX的处理机制:SAX是一种基于事件驱动的API。利用SAX解析XML文档,牵涉到两个部分:解析器和事件处理器。解析器负责读取XML文档,并向事件处理器发送事件,如元素开始和元素结束事件;而事件处理器则负责对事件作出响应,对传递的XML数据进行处理。zhangsan18文档开始  元素开始()  字符数据(空白)  元素开始()  字符数据(zhangsan)  元素结束()  字符数据(空白)  元素开始()  字符数据(18)  元素结束()  字符数据(空白)  元素结束()  文档结束这些事件将被发送到事件处理器中,然后由事件处理器中相应的方法对事件作出响应,这些方法也叫做回调方法(callbackmethod)。SAX解析器接口和事件处理器接口在org.xml.sax包中定义。XMLReader是SAX2.0解析器必须实现的接口(SAX1.0解析器实现Parser接口,该接口目前已经不赞成使用),这个接口允许应用程序设置和查询解析器的功能(feature)和特性(property),注册处理文档的事件处理器,以及启动文档的解析。解析器提供商负责提供实现XMLReader接口的解析器类,而我们所要做的就是编写事件处理器程序。SAXAPI定义了许多事件,这些事件分别由事件处理器中相应的方法去响应。在这些事件处理器中,ContentHandler接口是一个主要的处理器接口。如果应用程序要获得基本的解析事件,它就要实现这个接口,并使用XMLReader对象的setContentHandler()方法向解析器注册一个ContentHandler实例。解析器使用这个实例来报告与文档相关的基本事件,例如,元素开始和结束,以及字符数据等。在这个接口中,事件的顺序是非常重要的,它反映了文档自身信息的顺序。例如,元素的所有内容(字符数据,处理指令,子元素)都将依次在startElement事件和对应的endElement事件之间出现。ContentHandler接口类似于已经不赞成使用的SAX1.0的DocumentHandler接口,不过它增加了对名称空间和报告解析过程中跳过的实体的支持〔在非验证的XML处理器中)。voidSetDocumentLocator(Locatorlocator)   该方法接收一个用于获取文档分析时产生的SAX事件定位信息的对象。该方法将在解析器报告任何其它文档事件之前被调用。作为参数传递给这个方法的定位器对象,允许应用程序测定任何与文档相关的事件的结束位置。通常,应用程序会使用这个信息来报告它自身的错误(例如,与应用程序的商业规则不匹配的字符内容)。voidstartDocument()throwsSAXException |该方法接收文档开始的通知。SAX解析器将在任何其它事件回调方法被调用之前调用该方法(除了setDocumentLocator方法),并只调用一次。voidendDocument()throwsSAXException该方法接收文档结束的通知。SAX解析器将只调用这个方法一次,而且它是在解析过程中最后一个被调用的方法。voidstartPrefixMapping(Stringprefix,Stringuri)throwsSAXExceptionvoidendPrefixMapping(Stringprefix)throwsSAXExceptionstartPrefixMapping()方法在一个前缀-URI名称空间映射范围的开始时被调用。而endPrefixMapping()方法在前缀-URI映射范围结束时被调用。例如:下面的XML文档:....  SAX解析器在分析到元素时,就会调用startPrefixMapping()方法,将stu传递给prefix参数,将http://www.sunxin.org/students传递给uri参数,然后产生元素的startElement事件。在产生元素的endElement事件后,解析器将调用endPrefixMapping()方法,将stu传递给prefix参数。voidstartElement(Stringuri,StringlocalName,StringqName,Attributesatts)throwsSAXException该方法接收元素开始的通知。解析器在XML文档的每一个元素开始时调用这个方法。每一个startElement事件都有一个对应的endElement事件(即使是空元素)。在endElement事件之前,元素的所有内容都将被依次报告。这个事件允许每个元素最多有三个名称部分:1、名称空间URI;2,本地名;3、限定名。是否有这几部分,取决于http://xml.org/sax/features/namespaces和http://xml.org/sax/features/namespace-prefixes属性(property)的值。当namespaces属性是true(缺省值),名称空间URI和本地名是必需的。当namespaces属性是false。那么二者是可选的(但如果指定了其中一个名称,那么另外一个也必须指定)。当namespace-prefixes属性是true,那么限定名是必需的,否则是可选的,缺省值是false。注意:属性列表将只包含具有确切值(直接指定或缺省值)的属性,#IMPLIED属性将被忽略。只有当http://xml.org/sax/features/namespace-prefixes属性为true(缺省值是false,解析器对true值的支持是可选的),属性列表才会包括用于名称空间声明的属性(xmlns属性)。voidendElement(Stringuri,StringlocalName,StringqName)throwsSAXException该方法接收元素结束的通知。解析器在XML文档的每一个元素结束时调用这个方法。voidcharacters(char[]ch,intstart,intlength)throwsSAXException该方法接收字符数据的通知。解析器调用这个方法来报告宇符数据块。SAX解析器会把所有连续的字符数据放在一个单独的块中返回,或者把它们分成几个数据块。不过,在任何单一事件中的所有字符都必须来自同一个外部实体,以便Locator提供有用的信息(Locator要提供文档中事件结束的位置信息)。应用程序不要试图读取ch数组中指定范围以外的数据。要注意的是,有些解析器将使用ignorableWhitespaceo方法来报告元素内容中的空白,而不是用characters()方法(进行有效性验证的解析器就是如此)。voidignorableWhitespace(char[]ch,intstart,intlength) throwsSAXException该方法接收元素内容中可忽略的空白的通知。验证解析器将使用这个方法来报告元素内容中的空白字符块。SAX解析器会把所有连续的空白放在一个单独的块中返回,或者把它们分成几个数据块。不过,在任何单一事件中的所有空白字符都必须来自同一个外部实体,以便Locator提供有用的信息。voidprocessinglnstruction(Stringtarget,Stringdata)throwsSAXException该方法接收处理指令的通知。解析器每遇到一个处理指令就调用这个方法一次。注意,处理指令可以在XML文档的根元素(文档元素)之前或之后出现。voidskippedEntity(Stringname)throwsSAXException |该方法接收跳过的实体的通知。解析器每跳过一个实体就会调用这个方法.非验证的解析器如果没有看见实体声明的话(例如,实体在外部的DTD子集中声明),可以跳过实体。所有的处理器是否跳过外部的实体取决于http://xml.org/sax/features/external-general-entities和http://xml.org/sax/features/external-parameter-entities属性(property)的值。配置SAX解析器SAX提供了两种方法对解析器进行配置:功能(feature)和特性(property)。功能包括打开和关闭某个功能,例如验证。特性包括设置解析器所使用的特定项的值,例如设置SAX词法分析器实例。功能是通过XMLReader接口中的setFeature()方法来设置的,例如,要打开验证功能,可以调用setFeature()方法如下:xmlReader.setFeature("http://xml.org/sax/features/validation",true);在SAX中,每一个功能都是由一个特定的URI来标识,当前定义的标准功能的URI都以http://xml.org/sax/features/作为前缀。下面列出常用功能的URI:http://xml.org/sax/features/namespaces如果namespace为true,则解析器执行名称空间处理。在事件处理器的相应方法中,所有元素和属性的名称空间URI和未限定的本地名将可以使用。任何SAX2.0兼容的解析器都支持将namespaces的默认值设为true。http://xml.org/sax/features/namespace-prefixes如果namespace-prefixes设为true时.则解析器对名称空间前缀的解析提供支持。在事件处理器的相应方法中,XML限定名(带前缀的名宇)和属性(包括xmlns*属性)将可以使用。任何SAX2.0兼容的解析器都支持将namespace-prefixes的默认值设为false。http://xml.org/sax/features/external-general-entities设置解析器是否处理外部一般实体。如果对解析器启用了验证功能,则external-general-entities将总是true。http://xml.org/sax/features/external-parameter-entities设置解析器是否处理外部参数实体。如果对解析器启用了验证功能,则external-parameter-entities将总是true。http://xml.org/sax/features/validation设置解析器是否验证文档。如果为true,则所有的外部实体都将被处理。特性(property)是通过XMLReader接口中的setProperty()方法来设置的。特性和功能的设置是类似的,区别是特性以对象作为参数,而功能以布尔值作为参数。例如,要设置词法分析器实例,可以调用setProperty()方法如下:xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler",newMyLexicalHandler());SAX解析器工厂与DOM类似,JAXP也为SAX解析器提供了工厂类--SAXParserFactory类。SAX解析器工厂类的实例与DOM解析器工厂类的实例类似,都是通过newlnstance()方法来创建。不同的是,SAXParserFactory类的newlnstance()方法查找的工厂类属性是:javax.xml.parsers.SAXParserFactory如果使用Apache的Xerces解析器,可以配置如下:javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactorylmplSAX的异常类:ErrorHandler接口如果SAX应用程序需要实现定制的错误处理,那么它必须实现这个接口,并调用XMLReader对象的setErrorHandler()方法向解析器注册一个实例。之后,解析器将通过这个接口报告所有的错误和警告。要注意的是,如果一个应用程序没有注册ErrorHandler,XML的解析错误将不会被报告,而对干严重的错误(fatal |error),将会抛出SAXParseException异常。为了检测有效的错误,我们应该在注册的ErrorHandler实例的error()方法中进行某些处理。对于XML处理错误,SAX解析器必须优先使用这个接口,而不是抛出异常。至于是否为不同类型的错误和警告而抛出异常,则由应用程序来决定。然而,在ErrorHandler实例的fatalError()方法被调用后,解析器就没有必要再继续报告另外的错误了。也就是说,SAX解析器在报告了任何严重错误后,则可以抛出异常。另外,解析器也可以为非XML错误抛出适合的异常,例如,XMLReader.parse()方法在遇到访问实体或文档错误时,将会抛出一个IOException异常。voidwarning(SAXParseExceptionexception)throwsSAXException该方法接收警告通知。SAX解析器将使用这个方法来报告XML1.0推荐标准中定义的不是错误或者严重错误的情形。对于警告,缺省的行为是什么也不做。在调用这个方法之后,SAXA解析器必须继续提供正常的解析事件,因此应用程序仍然有可能处理完文档。voiderror(SAXParseExceptionexception)throwsSAXException该方法接收可恢复的错误的通知。error()方法对应了在XML1.0推荐标准的1.2小节中定义的"error"概念。例如,一个验证解析器将使用这个回调方法来报告违反有效性约束的情况。缺省的行为是什么也不做。在调用这个方法之后,SAX解析器必须继续提供正常的解析事件,因此应用程序仍然有可能处理完文档。如果应用程序不能这样做,那么解析器将报告一个严重错误,即使XML1.0推荐标准没有这样要求。voidfatalError(SAXParseExceptionexception)throwsSAXException该方法接收无法恢复的错误的通知。fatalError()方法对应了在XML1.0推荐标准的1.2小节中定义的"fatalerror"概念。例如,解析器将使用这个回调方法来报告违反格式良好约束的情况。在解析器调用这个方法之后,应用程序必须假定这个文档是不可使用的,而且应该只是为了收集另外的错误信息而继续进行处理。事实上,一当这个方法被调用之后,SAX解析器就停止报告任何其它的事件了。使用SAX解析XML文档实例第1个实例:SAXPrinter.java第2个实例:ErrorProcessor.java第3个实例:StudentLookup.javaJDOM、下载并配置JDOM和JDOMcAPI介绍:JDOM(JavaDocumentObjectModel),Java文档对象模型。DOM被设计为用于完成几乎所有的XML操作任务,同时它又是与语言无关的,这就导致了DOM的API庞大而又复杂。为了给Java程序员提供一套简单易用的操作XML的API,Java技术专家JasonHunter和BrettMcLaughlin创建了JDOM。JDOM利用了Java语言的优秀特性,包括方法重载、集合、反射以及Java程序员熟悉的编程风格,极大地简化了对XML文档的处理。和DOM类似,JDOM也使用对象树来表示XML文档,但是这些对象的工作方式对Java程序员更加直观。例如,要得到一个元素的文本内容,如下:张三在DOM中,元素的文本内容被看作是文本节点,作为元素节点的子节点,因此要得到元素的内容,需要在name节点对象上以如下的方式调用:Stringcontent=element.getFirstChild().getNodeValue();而JDOM则使用非常简单的方式来得到元素的文本内容:Stringcontent=element.getText();JDOM使用SAX解析器来分析XML文档,构建JDOM树。然而,JDOM本身并没有提供解析器,它使用其它开发商提供的标准SAX解析器,例如ApacheXerces,默认情况下JDOM通过JAXP来选择解析器(当然,你也可以通过指定解析器的类名来手动进行设置)。除了使用SAX解析来构建JDOM树外,JDOM还可以接收W3CDOM格式的内容,同时,JDOM也提供了从JDOM树到SAX事件流或W3CDOM树的输出机制。此外,为了方使操作,JDOM还对几个主要的XML解析器提供了适配器(例如:Apache的Xerces、Oracle的XML解析器、Sunl的Crimson、用于JAXPAPI的适配器、用于IBMXML4J解析器的适配器)。 |你可以在http://www.jdom.org/上下载最新版本的JDOM。第第1个实例:JDOMTest.java第2个实例:JDOMConvert.javadom4j、下载并配置dom4j和dom4jcAPI介绍dom4j与JDOM一样,也是一种用于解析XML文档的开放源代码的XML框架。在dom4j的网站上(http://www.dom4j.org),是这样描述dom4j的,"dom4j是一个简单的、灵活的开放源代码的库,支持XML,XPath和XSLT。与JDOM一样,dom4j也是应用于Java平台。dom4jAPI使用了Java集合框架并完全支持DOM、SAX和JAXP"。dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。dom4j也使用SAX解析器来分析XML文档,创建dom4j树。此外,dom4j也可以接收DOM格式的内容,并提供了从dom4j树到SAX事件流或W3CDOM树的输出机制。与JDOM不同的是,dom4j自带了一个SAX解析器Aelfred2,如果没有显式的设置SAX解析器,也没有通过系统属性org.xml.sax.driver设置解析器,dom4j将会使用JAXP来加载JAXP配置的解析器,如果创建解析器失败,那么最后将使用dom4j自带的Aelfred2解析器。dom4j是一个非常优秀的JavaXMLAPI,具有性能优异、功能强大和易用的特点,同时它也是一个开放源代码的软件。Sun的JAXM(JavaAPIforXMLMessaging)和大名鼎鼎的Hibernate(一种非常流行的对象-关系映射工具)使用的都是dom4j。在IBMdeveloperWorks上有一篇JavaXMLAPI的评测文章,评测的结果是dom4j的性能全面优于JDOM。你可以在下面的网址上看到这篇文章:http://www-128.ibm.com/developerworks/cn/xml/x-injava/index.html你可以在http://sourceforge.net/projects/dom4j/上下载最新版本的dom4j |第1个实例:Dom4jTest.java第2个实例:VisitorTest.java(访问者模式通常用于处理对象树结构,树中的每个节点对象都可以接受一个访问者对象,节点对象向访问者对象传递自身,而访问着对象则反过来调用节点对象的操作。)第3个实例:ElementHandlerTest.javadom4j支持对文档的基于事件的处理。对于较大的XML文档,我们可以利用dom4j提供的基于事件的处理模型,在解析的过程中进行处理,而不必等到整个文档解析完毕才进行处理。解析名称空间元素和属性的名称空间信息主要包括:名称空间前缀、名称空间URI(名称空间名字)或属性的本地名、元素或属性的限定名。例如,下面MXML文档片段中:JSP深入编程.....…….元素的名称空间前缀是bks,名称空间URI是http://www.sunxin.org/books,本地名是book,限定名是bks:book。DOM和名称空间DOMAPI在org.w3c.dom.Node接口中定义了得到元素或属性名称空间信息的方法。StringgetPrefix()得到元素或属性节点的名称空间前缀。 |StringgetNamespaceURI()得到元素或属性节点的名称空间URI。StringgetLocalName()得到元素或属性节点的本地名.StringgetNodeName()得到元素或属性节点的限定名。如果对元素和属性之外的节点调用getPrefix()、getNamespaceURI()、或getLocalName(),结果都将返回null.对元素或属性调用getNodeName()方法时,如果元素或属性是名称空间限定的,则返回的节点名称就是类似于bks:book这样的限定名,否则返回的节点名称就是book.为了判断元素或属性是否是名称空间限定的,可以通过查看getNamespaceURI()是否为空来判断。注意,不能通过getPrefix()来判断元素或属性是否是名称空间限定的,对于缺省名称空间范围内的没有前缀的元素,这个方法总是返回null.在DOM中,名称空间声明被看作是声明它的元素的属性节点。xmlns前缀被绑定到名称空间URI:http://www.w3.org/2000/xmlns/。例如:,对属性xmlns:bks调用getPrefix(),将返回xmlns;调用getNamespaceURI(),将返回http://www.w3.org/2000/xmlns/;调用getLocalName(),将返回bks;调用getNodeName(),将返回xmlns:bks。对于大多数的DOM解析器,对名称空间的支持在默认情况下是关闭的。要在程序中得到名称空间信息,需要在创建DOM解析器之前,调用解析器工厂类的setNamespaceAware()方法,打开对名称空间的支持,如下:DocumentBuilderFactorydbf=DocumentBuilderFactory.newlnstance();dbf.setNamespaceAware(true);DocumentBuilderdb=dbf.newDocumentBuilder();SAX和名称空间:SAX解析器在解析XML文档的过程中,利用事件向注册的ContentHandler实例传递名称空间信息。我们可以在startElement()和endElement()方法中获取到元素和属性的名称空间信息,这两个方法如下:voidstartElement(Stringuri,StringlocalName,StringqName,Attributesatts)voidendElement(Stringuri,StringlocalName,StringqName)throwsSAXExceptionuri是名称空间URI,localName是元素的本地名,qName是元素的限定名。属性的名称空间信息则通过Attributes接口中的相关方法得到,这些方法如下:StringgetURI(intindex)返回属性列表中指定索引的属性的名称空间URI。StringgetLocalName(intindex)返回属性列表中指定索引的属性的本地名。StringgetQName(intindex)返回属性列表中指定索引的属性的限定名。从上面这些方法可以看到,SAX并没有直接提供名称空间前缀的信息。我们可以通过限定名来得到名称空间前缀,在限定名中冒号(:)前的字符串就是名称空间前缀。利用java.lang.String类提供的方法,可以很容易提取到名称空间前缀。在SAX中,名称空间的声明没有作为元素的属性提供,而是作为单独的事件来报告。当声明一个名称空间的时候,SAX通过startPrefixMapping事件来报告,当名称空间所覆盖的范围结束的时候,SAX通过endPrefixMapping事件来报告。在ContentHandler接口中定义了这两个事件的方法:voidstartPrefixMapping(Stringprefix,Stringuri)throwsSAXExceptionvoidendPrefixMapping(Stringprefix)throwsSAXException如果使用JAXPAPI创建解析器,需要设置解析器对名称空间的支持。代码如下:SAXParserFactoryspf=SAXParserFactory.newlnstance();spf.setNamespaceAware(true);SAXParsersp=spf.newSAXParser(); |如果使用XMLReaderFactory工厂类创建SAX解析器,默认情况下对名称空间支持的功能是打开的。JDOM和名称空间:JDOM在Element和Attribute类中定义了如下的方法,用于获取名称空间的信息。publicjava.lang.StringgetNamespacePrefix()返回名称空间前缀publicjava.lang.StringgetNamespaceURI()返回名称空间URIpublicjava.lang.StringgetName()返回本地名publicjava.lang.StringgetQualifiedName()返回限定名在JDOM中,名称空间声明也不被看作是属性,JDOM在Element类中,提供了一个getAdditionalNamespaces()方法,用于得到在该元素上附加的名称空间声明。publicJava.util.ListgetAdditionalNamespaces()以列表的形式返回在这个元素上附加的名称空间声明.列表中的每一个对象都是Namespace类型,Namespace类提供了如下的两个方法,用于得到名称空间前缀和URI。publicjava.lang.StringgetPrefix()publicjava.lang.StringgetURI()要注意的是,getAdditionalNamespaces()方法只是返回在元素上附加的名称空间声明,对于元素本身的名称空间并不会返回。例如:元素上调用getAdditionalNamespaces().只会返回xmlns:p的名称空间声明。如果要得到该元素的名称空间,可以调用getNamespace()方法,如下:publicNamespacegetNamespace()当然也可以直接使用前述的四个方法来得到名称空间的相关信息。对于JDOM,在默认情况下,对名称空间的支持功能在底层的SAX解析器中是打开的。如要要控制解析器的行为,可以使用SAXBuilder类的setFeature()和setProperty()方法,不过在使用时一定要小心,因为JDOM要利用SAX解析器的某些功能和特性(property)来完成分析任务,因此对setFeature()和setProperty()方法的调用,有可能会中断JDOM的解析过程。即使不会中断JDOM的解析,在将来的JDOM版本中仍然有可能会导致解析中断,因为JDOM解析器会根据将来的需要而作出改变。dom4j和名称空间dom4j在Element和Attribute接口中定义了获取名称空间信息的方法,这些方法和JDOM中的方法同名,如下所示:publicjava.lang.StringgetNamespacePrefix()返回元素(属性)的名称空间前缀publicjava.lang.StringgetNamespaceURI()返回元素(属性)的名称空间URIpublicjava.lang.StringgetName()返回元素(属性)的本地名。publicjava.lang.StringgetQualifiedName()返回元素(属性)的限定名。同JDOM一样,dom4j也提供了一个单独的方法来得到在某个元素上附加的名称空间声明,如下所示:publicjava.util.ListadditionalNamespaces()返回的名称空间声明列表中每一个对象都是Namespace类型,这个类提供了如下的两个方法,用于得到名称空间前缀和URI。publicjava.lang.StringgetPrefix()publicjava.lang.StringgetURI()同样,additionalNamespace()方法也只是返回在元素上附加的名称空间声明,对于元素本身的名称空间并不会返回。如果要得到元素本身的名称空间,可以调用getNamespace()方法,该方法如下:publicNamespacegetNamespace()当然也可以直接使用前述的四个方法来得到名称空间的相关信息。 |对于dom4j,在默认情况下,对名称空间的支持功能在底层的SAX解析器中是打开的。如要要控制解析器的行为,可以使用SAXReader类的setFeature()和setProperty()方法,与JDOM的情况一样,在使用这两个方法时要小心。此外,dom4j还提供了一种可选的配置解析器的方式:先对一个XMLReader对象进行正确配置,然后调用SAXReader类的setXMLReader()方法,设置dom4j使用的SAX解析器。小结:DOM是W3C组织推荐的处理XML文档的标准接口,而SAX是社区讨论的产物,是一种事实上的标准。JDOM和dom4j为Java程序员提供了一种简单而又高效的访问XML文档的方式,特别是dom4j,不但功能强大,而且性能优异,可以作为今后解析XML文档的首选API。DOM在内存中以节点树的形式表示XML文档,由于树在内存中是持久的,因此可以在任何时候对树中的节点进行导航,并可以对其进行修改。DOM的缺点是,对于特别大的文档,解析并加载整个文档将会很慢,而且会消耗大量的资源。SAX是一种基于事件驱动的API。SAX解析器在解析XML文档的时候可以触发一系列的事件,当发现一个标记时,它可以激活一个回调方法,告诉该方法找到一个标记。SAX不存储先前的数据,因此不能对XML文档进行修改。SAX解析速度快、对内存的需求低,这对大文档来说是一个优点。和DOM类似,JDOM也使用对象树来表示XML文档。JDOM底层使用SAX解析器来分析XML文档,构建JDOM树。JDOM为Java程序员提供了一种十分简便的访问XML文档的API。不过相对于dom4j来说,JDOM的性能较差。dom4j与JDOM有许多相似之处,不过功能更为强大,性能也更为优异。dom4j在API中集成了对Path的支持,提供了用于大文档的基于事件的处理模型。dom4j自带了一个SAX解析器Aelfred2,在没有其它解析器可用的情况下,将使用这个解析器。第4章XSL转换XSLT概述Xalan处理器模板规则元素匹配节点的模式mode属性、内置的模板规则对空白的处理XPath语言XPath上下文位置路径表达式核心函数库创建结果树创建元素和属性创建文本创建处理指令创建注释复制节点 |输出格式化的数字条件处理排序变量和参数变量参数命名模板合并样式表导入样式表包含样式表模板规则冲突的解决元素指定输出文档的格式输出XML声明输出文档类型定义输出CDATA段指定文档缩进指定媒体类型XSLT中的函数数字格式化查询和分组处理多个输入文档JAXP中的XSLT API转换器工厂Transformer和Templates一个例子

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭