【笔记】《深入体验Java Web开发内幕:核心基础》第1章-XML基础

第1章 XML基础

1.1 XML技术概述

1.1.1 XML的起源与作用

(P10)

XML是eXtensible Markup Language(可拓展标记语言)的缩写

XML和HTML一样,都衍生于SGML(Standard Generalized Markup Language,标准通用化标记语言)。

1.1.2 XML文档结构

(P11)

1.1.3 XML与HTML的比较

(P12)

(1)HTML将数据和其显示效果混在一起,它是一种表现技术,定义了如何显示信息的标签;而XML文档只是存储了数据和描述了数据之间的关系。

(2)HTML格式要求比较松散。XML是非常严格的标记语言,例如严格区分大小写。

(3)HTML标记集合是固定的。XML没有提供一组事先定义好的标签,只是提供一个标准。

(4)XML允许粒度更新。HTML不支持

1.1.4 XML与数据库的比较

(P13)

1.2 XML的基本语法

1.2.1 文档声明

(P14)

<?之间、?>之间以及第一个xml之间不能有空格

W3C的XML1.0规范里规定,所有的XML解析器必须接受UTF-8和UTF-16编码的Unicode字符,所以,符合XML规范的软件工具一定都支持这两种Unicode编码。如果XML声明中没有设置encoding属性来明确指定文档所用的字符编码方式,则一律以Unicode编码看待。

在XML文档声明语句中,还可以指定另外一个可选属性:standalone,例如:

standalone用以说明文档是否是独立的。“yes”说明文档没有依赖外面的任何文件而可以存在。“no”说明该文档依赖于外面的某个文件,例如,依赖于某个DTD文件来验证其中的标识是否有效,或XSL、CSS文件来控制其显示外观。standalone默认为“yes”

注意:如果设置了encoding和standalone属性,standalone要在encoding之后。

1.2.2 元素定义

(P18)

一个XML元素由一个标记来定义,包括开始和结束标记以及其中的内容,例如:

<书名>Java就业培训教程

没有嵌套在其他元素内的元素为根元素,根元素通常是XML文档中定义的第一个元素。格式良好的XML文档必须有且只有一个根元素,其他元素都是这个根元素的子孙元素。

如果在一个元素中没有嵌套子元素和数据,也就是标记对之间没有内容,这样的元素称为空元素。空元素可以不用结束标记:例如可以改写成。空标记一般都与属性配合使用,例如,

在HTML中,有的标记没有或者可以不用结束标记或结束说明,如。在XML中,所有的标记都必须有结束标记或者使用空元素的结束说明。另外,许多HTML浏览器很宽容,而XML中,所有元素都必须合理嵌套,绝对不允许标签交叉来破坏文档的结构化层次关系。

XML元素的标记名称中可以包含字母、数字以及其他一些可见字符,但必须遵守下面的一些规范:

  • 区分大小写。HTML不区分大小写,但XML对大小写要求非常严格。
  • 不能以数字或“_”(下划线)开头。
  • 不能以字符组合xml或XML或Xml等开头。
  • 不能包含空格。
  • 名称中间不能包含冒号(:)。

为了使XML元素更容易阅读理解和操作,对XML元素的标记名称还有一些建议:

  • 不要使用“.”,因为在很多程序语言中,"."用于引用对象的属性。
  • 最好不要用减号(-),而以下划线(_)代替,以避免与表达式中的减号(-)运算符发生冲突。
  • 名称尽量简短,以减少XML文档的大小。
  • 名称的大小写尽量采用同一标准,要么全部大写,要么全部小写。
  • 名称可以使用非英文字符,例如中文,但是有些软件可能不支持非英文字符以外的字符,在使用时应考虑这种情况。

1.2.3 属性定义

(P19)

和HTML一样,也可以为XML标签设置属性(Attribute)。XML中的属性也是自己随便定义的,用于对标签进一步描述和说明。一个标签可以有多个属性,每个属性都有名称和取值。

<售价 单位="元">58

在上面的语句中,标签<售价>定义了一个名为“单位”属性。在HTML中,属性值可以用双引号、单引号引起来,也可以不使用任何引号。在XML中,属性值一定要用双引号或单引号引起来,否则将被视为错误。

属性可以被改成用子元素来描述同样的信息,例如下面片段和上面语句表达同样的信息:

<售价>
    <单位>单位>
    <价格>58价格>
售价>

属性不易被扩充和被程序操作,但程序处理的速度比使用子元素快。

1.2.4 注释

(P19)

XML和HTML文档的注释方式完全一样:

注意,XML声明只能作为XML文件中的第一行,所以不要把注释放在XML声明之前。注释不能嵌套使用,因为“

1.2.5 空格和换行的处理

(P20)

HTML文本中连续出现的多个空格和回车换行,总是显示为一个空格。在XML文本中出现的所有空格和换行,XML解析程序都有一个个如实地交给下游程序去处理。例如下面两端内容意义是不一样的。

第一段:

<网址>www.it315.org网址>

第二段:

<网址>
    www.it315.org
网址>

第一段中的元素内容仅有“www.it315.org”这个文本串,而第二段中的元素内容为“回车换行”符、“TAB”制表符、“www.it315.org”文本串、又一个“回车换行”符等的总和。 在XML中,空格和换行都作为原始内容被处理

1.2.6 CDATA区

(P20)

CDATA是character data的简写,即字符数据。CDATA区指的是不想被解析程序解析的一片原始数据区,它以“”开始,以“]]>”结束。

1.2.7 特殊字符

(P21)

在XML文档中,有些特殊字符需要用转义字符序列表示其原始字面意义。这类字符在XML中称为预定义实体

特殊字符 替代符号
& &
< <
> >
" "
'

1.2.8 处理指令

(P22)

处理指令是Processing Instruction的中文翻译,简称PI,用来为处理XML文档的应用程序提供提示信息。处理指令以""作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。XML分析器把处理指令原封不动地传给应用程序,由应用程序来解释这个指令,按照它提供的信息进行处理。例如,在某个XML文档中可以包含下面的语句来告诉浏览器使用book.css控制其显示效果:

CSS(Cascading Style Sheets,层叠样式表)

1.3 XML的约束模式

1.3.1 格式良好的(Well-formed)XML

遵守XML基本语法规则和规范的XML文档就可以称之为“Well-formed XML”,中文意识就是“格式良好的XML”。一个XML文档首先必须是格式良好的。

1.3.2 XML的约束模式

(P24)

有些情况下,还需要定义一套规则来对XML文档中的内容做出限制,这套定义的规则就是XML文档的约束模式。

约束模式定义了XML文档中允许出现的元素名(也就是标记名)、元素中的属性、内容类型,以及元素之间的嵌套关系和出现顺序。可见,XML约束模式不仅定义了XML文档的词汇表,它还定义了一个XML文档必须遵循什么样的结构。如果把一个XML文件看做数据库中的一个表,那么XML约束模式就相当于数据库表结构的定义,在创建一个表时可以为其中的字段定义约束规则,在XML约束模式中则可以为XML文档标签定义约束规则。

如果没有为一个XML文档指定约束模式,那么该文档中可以包含任何类型的标记;如果为一个XML文档指定了约束模式,那么它必须满足约束模式所规定的结构、数据类型和数据关联等内容。

1.3.3 XML的约束模式语言

(P25)

XML约束模式语言是用来创造XML标记语言的语言,这种用于定义另一种语言的语言被称为元语言。约束模式通常都是在一个单独文件中进行定义,这个文件被称为模式文档。模式文档采用某种约束模式语言编写,用于描述XML文档的结构。依照模式文档编写的XML文档被称为实例文档,它包含真正的XML数据。

先后出现的XML约束模式语言有XML DTD、XDR、SOX、XML Schema等,其中应用最广泛和具有代表意义的是XML DTD和XML Schema。XML DTD(Document Type Definition,文档类型定义)是早期出现的一种XML约束模式语言。 XML Schema出现目的是为了克服DTD的局限性,为XML文档提供丰富的语法结构。XML Schema已经成为了W3C的正式推荐标准,由于它比DTD具有更多的功能和灵活性,而且采用的全是XML语法,XML Schema已逐步呈现出替代XML DTD的趋势。

1.3.4 有效的(Valid)XML

(P25)

一个遵守XML的基本语法规则、且符合为它指定的某个XML约束模式的XML文档就可以称之为“Valid XML”文档,中文意思就是“有效的XML”文档。一个XML文档不一定需要是有效的,但必须是格式良好的。将一个XML文档和它所引用的XML约束模式进行比较分析,看其中的内容是否符合XML约束模式的过程叫校验(validation),校验过程也是通过解析器程序软件(Parser)来处理的。根据能否对XML文档进行约束模式校验,可以将XML解析器分为两类:非校验类解析器和校验类解析器。 IE浏览器属于非校验类解析器,它不验证XML文档是否符合某个约束模式,它只检测XML文档格式是否是良好的。

1.4 DTD

1.4.1 对DTD的初步认识

(P26)

<!ELEMENT 书架 (书+)>
<!ELEMENT  (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

每一条语句用于定义一个元素,通用语法格式为

元素的使用规则定义了元素中包含的组成成分,以及每种组成成分出现的次数、次序,还可以是某些成分进行某种组合后出现的次数、次序。例如,(#PCDATA)用于表示元素中嵌套的内容是普通文本字符串;(书名,作者,售价)用于表示元素中要嵌套书名、作者、售价等子元素,并且这些子元素要按顺序依次出现;在元素的使用规则中可以通过正则表达式来定义子元素出现的次数,(书+)中的元字符“+”用于表示它修饰的成分必须出现一次或多次。

DTD文件应该使用UTF-8或Unicode编码。

1.4.2 在XML文档中引入外部DTD文件

(P27)

如果一个XML文档想说明自己是一个有效的XML文档,它除了要严格遵循某个DTD文件中定义的规则外,还必须指明其所遵循的是哪个DTD文件,以便解析器程序能够对它进行有效性检验。 XML文档通过DOCTYPE声明语句(文档类型定义语句)来指明它所遵循的DTD文件。DOCTYPE声明紧跟在XML文档声明语句的后面,有两种格式:

(1)

(2)

各部分的意义和作用如下:

  • 文档类型名称可以用XML文档编写者自己定义,一个通用的习惯是使用XML文档的根元素名称来作为文档类型名称。
  • 关键字SYSTEM(第一种格式)表明XML文件所遵循的是一个本地或组织内部所编写和使用的DTD文件;关键字PUBLIC(第二种格式)表明该XML文件所遵循的是一个权威机构制定的、公开提供给特定行业或公众使用的DTD文件,而不是某个组织内部的规范文件。
  • **“DTD名称”**用于指定该DTD文件的标识名称,它只在使用关键字PUBLIC的DOCTYPE声明语句中出现。DTD标识名称需要用双引号(")括起来。例如用与Java Web应用程序的配置文件的DTD文件标识名称为"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"。DTD标识名称应符合一些标准的规定,对于ISO标准的DTD以"ISO"三个字母开头;被改进的非ISO标准的DTD以加号"+“开头;未被改进的非ISO标准的DTD以减号”-“开头。紧跟着开始部分后面的是双斜杠”//",及DTD所有者的名称,在这个名称后又是双斜杠"//",之后是DTD描述的文件说明,最后在双斜杠"//"后面是语言的种类。虽然标识名称看上去比较复杂,但这完全是由DTD文件发布者去考虑的事情,XML文件的编写者只要把DTD文件发布者事先定义好的DTD标识名称复制到相应的位置就可以了。
  • **“DTD文件的URL”**部分指定该DTD文件所在的位置,需要用双引号(")括起来。对于使用PUBLIC属性的DOCTYPE语句,"DTD文件的URL"指定该DTD文件在Internet上的绝对URL,例如,用于Java Web应用程序的配置文件的DTD文件的位置为"http://java.sun.com/dtd/Web-app_2_3.dtd"。解析器在对XML文档进行有效性确认时,通常都需要从该指定的URL下载DTD文件,但是对于一些已经指定成为行业标准的DTD文件,一些相应的解释器程序可能已经将它们内嵌进去。 URL除了可以是Internet上的一个绝对URL外,还可以是本地文件系统的相对路径。

如果想明确要求解析器程序必须对XML文档进行有效性验证时,XML声明语句中的standalone属性应设置为"no"。

一般情况下,使用DOCTYPE声明语句后,即使在XML声明语句中省略了standalone属性,解析器也会自动对XML文档进行有效性验证。

1.4.3 在XML文档中直接嵌入DTD定义语句

(P29)

在XML文档中,还可以使用另外一种形式的DOCTYPE声明语句来直接包含DTD定义语句,其格式为:



最好采用上一节的方式,将DTD定义语句放在一个单独的DTD文件中进行定义,然后由各个XML文件引用这个外部DTD文件。这样便于DTD定义的管理和维护,以及被多个XML文件所共享。

在使用DOCTYPE声明语句引入一个外部的DTD文件的同时,还可以在这个DOCTYPE声明语句嵌入DTD定义语句,如下所示:


看到这里为止,我们可以归纳总结一下XML文档的各个组成部分了。从整体结构上来看,一个完整的XML文档包括如下一些组成部分:

  • XML声明(declaration)
  • DOCTYPE声明语句
  • 处理指令(processing instruction)
  • 元素(element)
  • 注释(comment)
  • CDATA区

但注意的是,不是每个XML文档都必须有这些组成部分。

1.5 DTD的语法细节

1.5.1 元素定义

(P30)

  • (#PCDATA)
  • 圆括号()
  • 嵌套文本字符串与其它子元素的混合
  • EMPTY
  • ANY

(1)XML DTD使用与XML文档同样的注释方式

(2)每条元素定义语句的顺序是无关紧要的。

(3)不能使用相同元素名 混淆 可读性变差

(4)空白符间隔 出现顺序没有严格要求 逗号间隔 必须与它们排列顺序一致

(5)竖杠字符(|)分隔,那么在XML文档中只能出现它们之中的任何一个

(6)“+”用于表示出现一次或多次 “?”用于表示出现一次或不出现 “*”用于表示可以不出现,也可以出现一次或多次 不使用任何元字符表示只能出现一次

(7)圆括号()可用于将括在其中的内容组合成一个可统一操作的分组,分组可以嵌套更小的分组。

1.5.2 属性定义

(P32)

ATTLIST用于定义一个元素所有属性设置信息,其中可以定义一个或多个属性。

设置说明:

  1. #REQUIRED 必须设置该属性
  2. #IMPLIED 可以设置,也可以不设置
  3. #FIXED 固定为一个默认值
  4. 直接使用默认值 没有任何关键字,则XML文件中可以设置,也可以不设置该属性。如果XML中没有设置,该属性自动设置为DTD中定义的默认值;如果XML中设置了,可以使用新的属性值来覆盖DTD中定义的默认值。

设置类型:

  1. CDATA
  2. ENUMERATED(枚举类型) DTD不会出现关键字ENUMERATED。
  3. ID 唯一标识一个XML文件中的某个元素 符合一定的名称规范 不要给ID类型属性指定默认值
  4. IDREF和IDREFS
  5. NMTOKEN和NMTOKENS NameToken名称记号
  6. NOTATION 语句定义一个notation(符号)
  7. ENTITY和ENTITYS 实体 语句定义一个实体(entity)的引用 设置值只有引用实体才可以,参数实体不能

1.5.3 实体定义

(P37)

1.引用实体

定义格式:

引用方式:&实体名称;

2.参数实体

定义格式:

引用方式:%实体名称;

1.6 XML Schema

1.6.1 XML Schema和DTD的比较

(P41)

(1)XML Schema符合XML语法结构

(2)一些常用的XML API,例如DOM和SAX,它们只能处理XML实例文档,并没有提供解析XML DTD文档内容的功能

(3)DTD本身合法性的验证必须采用另一套机制,XML Schema采用与XML文档同样的合法性验证机制。

(4)XML Schema对名称空间支持得非常好,而XML DTD几乎不支持名称空间。

(5)DTD支持的数据类型非常有限;而XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型

(6)XML Schema定义约束能力非常强大。

(7)XML Schema基本上满足关系模式在数据描述上的需要,比XML DTD更适合描述关系数据。

XML Schema也有一些缺陷,例如,不能像DTD一样定义实体,XML Schema比DTD更复杂。

1.6.2 一个XML Schema例子

(P42)

XML Schema模式文档的扩展名通常为.xsd

(1)元素为所有XML Schema模式文档的根元素

(2)词汇来自统一规定的模式文档

(3)定义实例文档中的一个元素

(4)复杂类型 等标签用于表示子元素的各种组合关系

(5)maxOccurs='unbounded'属性设置用于说明嵌套在中的子元素定义可以在XML实例文档中出现多次,上不封顶。

1.7 名称空间

1.7.1 名称空间的概念

(P44)

(1)使用名称空间这个概念来区分每个约束模式文档,每个约束模式文档被赋予一个唯一的名称空间,每个名称空间都有唯一的URI(Uniform Resource Identifier,统一资源标识符)表示。

(2)实例文档中为元素增加前缀部分,元素名称前增加的前缀名称代表该元素所属于的模式文档的名称空间。

URI比URL(Uniform Resource Locater,统一资源定位符)表示的概念更大,它不仅限于描述Internet资源的地址,还包括数字对象标识符(DOI)和国际标准书号(ISBN)等标识名称。

1.7.2 名称空间声明

(P45)

xmlns:前缀名称="URI"

1.7.3 默认名称空间

(P46)

xmlns="URI"

1.7.4 属性的名称空间

(P46)

1.7.5 xml:space和xml:lang属性

(P47)

xml:space属性用于设置下游应用程序应该如何处理解析器传递的空格等字符。 设置值必须是"default"或"preserve"

xml:lang属性用于设置元素的本地化语言信息

1.8 引入XML Schema文档

1.8.1 使用名称空间引入XML Schema文档

(P48)

声明XML实例文档遵循某个XML schema文档的方式之一就是使用名称空间。 要使用XML Schema文档对XML实例文档进行校验,除了要声明名称空间外,还必须指定该名称空间所对应的XML Schema文档的存储位置。

XML解析程序都应内嵌有那些公认的标准名称空间的XML Schema文档的内容信息,因此在使用公认的标准名称空间时,不用去寻找它们所对应的XML Schema文档的内容,自然也不用指定XML Schema文档的存储位置。

一个XML实例文档可能引用多个名称空间的名称。

1.8.2 不使用名称空间引入XML Schema文档

(P50)

noNamespaceSchemaLocation属性

你可能感兴趣的:(java,java,web,核心基础,xml,笔记)