这段时间一直在看《核心技术》的XML部分,由于这本书只是讲怎么操作xml,没有很系统的讲xml,故在图书馆借了一本关于XML的书,看完相应部分,再在网上复制各种笔记,然后自己照书写了一部分,零零散散的也算是《XML学习笔记》吧:
XML简介
XML 不是对 HTML 的替代,是对 HTML 的补充,理解这一点很重要。在大多数 web 应用程序中,XML 用于传输数据,而 HTML 用于格式化并显示数据。
对 XML 的最好的描述是:XML 是独立于软件和硬件的信息传输工具。
XML文档在逻辑上主要由以下五个部分组成。
1、XML声明
2、文档类型声明
3、元素
4、注释
5、处理指令
XML声明
XML文档总是以一个XML声明开始,其中指明所用的XML版本,文档的编码,文档的独立性信息,其格式如下:
<?xml 版本信息 [编码信息] [文档独立性信息]?>
一对中括号([])中的部分表示是可选信息
版本声明:
<?xml version=”1.0”?>
文档编码声明:
在XML声明中还可以加上文档编码信息,默认是UTF-8,如果要使用中文,我们可以在声明中加上encoding=”gb2312”,如下所示
<?xml version=”1.0” encoding=”gb2312”?>
独立文档声明如果我们的文档不依赖于外部文档,在XML声明中,我们可以通过standalone=”yes”来声明这个文档是独立文档,如果文档依赖于外部,可以通过standalone=”no”来声明,完整的XML声明如下所示:
<?xml version=”1.0” encoding=”gb2312” standalone=”yes”?>
XML声明必须位于文档的第一行,前面不能有任何字符
注释
·XML的注释和HTML的注释类似,都是以<!--开始,以-->结束。位于<!--和-->之间的数据将被XML处理器忽略。
元素
在给元素命名的时候要注意,以“xml”或其他任何匹配((“X”|”x”)(“M”|”m”)(“L”|”l”))的字符串开头的名字,被保留用于XML规范的当前版本或后续版本的标准化。此外,在给元素命名时,还要遵守下列规范:
1. 名称只能以字母,下划线(_)或者冒号(:)开头;
2. 名称中可以包含字母,数字,下划线以及其他在XML标准中允许的字符;
3. 名称中不能包含空格;
4. 名称中尽可能不要使用冒号,因为冒号在名称空间中被用于分隔名称空间前缀和本地部分
元素-字符数据
·在一个元素的内容中,字符数据可以是不包括任何标记的起始定界符和CDATA段的结束定界符的任意字符串,也就是说在元素的内容中,字符数据不能有和号(&)和小于号(<),也不能有字符串”]]>”
注:&号是字符引用和实体引用的起始定界符
<号是元素开始标签的起始定界符
“]]>”是CDATA段的结束定界符
·在CDATA段中,字符数据可以是不包括CDATA段的结束定界符的任意字符串
·判断下列元素的内容是否合法
-<data>&</data> 错
-<data>/</data> 对
-<data>/></data> 对
-<data><</data> 错
-<data>]]></data> 错
元素-字符引用和实体引用
·在字符数据中,不能有和号(&)和小于号(<),因为未经处理的小于号与和号在XML文本中往往被解释为标记的起始定界符(例外的情况见下面要介绍的CDATA段)
·在XML中,提供了5个预定义的实体引用,分别引用XML文档中的5个特殊字符;
小于号(<),小于号(>),双引号(“),单引号(‘),和号(&),这5个特殊字符也可以通过字符引用的方式去引用
·字符引用和预定义实体引用都是以一个和号(&)开始并以一个分号(;)结束。如果用的是字符引用,需要在和号(&)之后加上一个井号(#),之后是所需字符的十进制代码或十六进制代码(ISO/IEC 10646字符集中字符的编码)。如果用的是预定义实体引用,在和号(&)之后写上字符的助记符
字符 预定义实体引用
< <
> >
“ "
‘ '
& &
注:什么时候要使用字符引用和预定义实体应用?在一些会与定界符混淆的地方,而需要使用上述符号的时候,就使用字符引用和预定义引用来表示上述符号
字符引用:可以引用各种存在于ISO/IEC10646字符集中编码的字符
元素-CDATA段
·CDATA段中包含的都是纯字符数据,在字符数据可以出现的任何地方都可以使用CDATA段
·CDATA段主要用于需要将整个文本解释为字符数据而不是标记的情况下。CDATA段中的内容不被XML处理器分析,所以可以在其中包含任意的字符。例如,在XML文档中,我需要包含JAVA代码,而JAVA代码中可能存在着小于号(<),大于号(>),双引号(“),单引号(’),和号(&)这些特殊字符,这个时候,CDATA段就派上用场了。
·CDATA段以字符串“<![CDATA[“开始,以字符串”]]>”结束。
注:CDATA段无法直接将”]]>”字符串解释为文本,这是因为”]]>”字符串表示CDATA段本身的结束定界符,要解决CDATA段中出现”]]>”字符串并要将其翻译成文本,有两种解决方法:第一,在”]]>”字符串中非首尾位置添加空格。第二,将”]]>”字符串分开写到两个CDATA段中。
注:CDATA段和字符引用(预定义实体引用)的区别使用:当元素中特殊字符出现频率低,数量少的时候,建议使用字符引用(预定义实体引用)。当元素中特殊字符出现频率高,数量多的时候,建议使用CDATA段。
XML命名空间:用来解决XML元素的名称冲突和多义性问题。
命名空间是通过使用一系列保留属性进行声明的,这一系列保留属性的名称必须是xmlns或以"xmlns:"作为前缀。如:xmlns:prefix="URL"
DTD结构
·DTD的结构一般由元素类型声明,属性表声明,实体声明,记号(notation)声明等构成。一个典型的文档类型定义文件会把将来所要创建的XML文档的元素结构,属性类型,实体引用等预先进行定义。
DTD 文档类型定义
XML从SGML继承了用于定义语法规则的DTD机制,但DTD本身并不要求遵循XML规则,几乎所有的XML应用都是使用DTD来定义的,HTML就有一个标准的DTD文件,所以其组织结构和所有的标签都是固定的。DTD文件也是一个文本文件,通常用“.dtd“作为其扩展名
通过文档类型声明,指出XML文档所用的DTD,文档类型声明有两种形式:
一种是直接在XML文档中内部DTD,如下:
<!DOCTYPE 根元素名称[
<!ELEMENT 子元素名称 (#PCDATA)>
]>
一种是声明DTD在一个外部文件中,如下:
<!DOCTYPE 根元素名称 SYSTEM “DTD-URL”>
或
<!DOCTYPE 根元素名称 PUBLIC “DTD-name” “DTD-URL”>
注:SYSTEM 指该外部DTD文件时私有的,即用户创建但没有公开发行,只在个人或几个合作者之间使用;
PUBLIC 指该外部DTD文件是公有的
DTD对元素声明
在DTD中元素类型是通过ELEMENT标记声明的,语法格式如下:
<!ELEMENT 元素名称 类别> 或
<!ELEMENT 元素名 (元素内容)>
EMPTY(空): <!ELEMENT 元素名称 EMPTY>
ANY(任意):<!ELEMENT 元素名称 ANY>
子元素型: <!ELEMENT 根元素名称 (子元素列表)>
<!ELEMENT 根元素名称 (子元素1,子元素2,···,子元素n)>
混合型: <!ELEMENT 根元素名称 (#PCDATA|子元素1|子元素2|···|子元素n)>
#PCDATA: 声明为#PCDATA类型的元素不包含其他子元素而只能有文本数据,文本数据中可以是普通字符、CDATA段中的内容、字符引用和实体引用。
<!ELEMENT 元素名称 (#PCDATA)>
实体声明
·有两种类型的实体:一般实体(general entity)和参数实体(parameter entity)。
·一般实体是在文档内容中使用的实体,而参数实体则是在DTD中使用的已分析实体。
·不管是一般实体,还是参数实体都是用ENTITY关键字来声明。
一般实体和参数实体
·一般实体的声明语法如下:
<!ENTITY 实体名 “实体内容”>
引用实体的方式为:”&实体名;”
·参数实体只能在DTD中使用,它的声明语法如下:
<!ELEMENT % 实体名 “实体内容”>
注意在声明时,ENTITY,%和实体名之间各有一个空格,引用实体的方式为:”%实体名;”。
注:内部DTD子集而言,不允许在标记声明的内部出现对参数实体的引用,但是可以出现在标记声明允许出现的地方。外部DTD子集则没有这个限制。
·在DTD中,所有的参数实体必须在引用之前进行声明。这意味着内部DTD子集不能引用在外部DTD中声明的参数实体,这是因为XML处理器将首先读取内部子集,也就是说,内部子集中的实体和属性表声明的优先级要比在外部子集中的高。
属性表声明
·属性用于将名字-值对于元素进行关联。属性说明只能在开始标签和空元素标签中出现。属性表声明详细说明了与给定元素类型相关联的每一个属性的名字,数据类型和缺省值(如果有的话)。
·属性表声明的语法如下:
<!ATTLIST 元素名 属性名 属性类型 缺省声明>
元素名是属性所属的元素的名字,属性名是属性的命名,属性类型则用来指定该属性是属于哪种类型,共有十种类型,缺省声明用于说明在元素中该属性是否必须出现,如果不是必须出现,那么当该属性没有出现,那么当该属性没有出现时,XML处理器应该如何处理。
缺省声明
·缺省声明可以有四种缺省设置,#REQUIRED,#IMPLIED,#FIXED+缺省值,只有缺省值。
·#REQUIRED
关键字REQUIRED说明必须为元素提供该属性。
·#IMPLIED
关键字IMPLIED说明元素可以包含该属性,也可以不包含该属性。
·#FIXED+缺省值
关键字FIXED+缺省值,说明一个固定的属性缺省值,文档的编写者不能修改该属性的值。如果元素中不包含这个属性,XML处理器将以声明的缺省值向应用程序报告该属性。
例:<!ATTLIST article copyright CDATA #FIXED 缺省值>
注:如果文档中article元素没有给出copyright属性 XML处理器就会以缺省值给出copyright属性。当然,也可以在文档中使用copyright属性,但FIXED给出的是固定缺省值,我们在使用copyright属性的时候不能将其修改,只能使用该缺省值。
·只有缺省值
与FIXED+缺省值一样,如果元素不包括该属性,XML处理器将以声明的缺省值向应用程序报告该属性。不同的是,这种声明方式属性的值是可以改变的。
注:可以将多个缺省声明合为一个,只需在上一个缺省声明后加空格,然后继续添加缺省声明。
属性类型
·在属性表声明时,总共有十种属性类型可以选择,分别是:CDATA,Enumerated,ID,IDREF,IDREFS,ENTITY,ENTITIES,NMTOKEN,NMTOKENS,NOTATION。
·CDATA
这是最常用的一种属性类型,表明属性值为字符数据,与元素内容说明中的#PCDATA相同,如果属性值需要出现小于号(<)和双引号(“),可以通过预定义实体引用或字符引用的方式插入小于号和双引号。如果包含的和号(&)不是字符或实体引用的起始定界符,也必须使用预定义实体引用或者字符引用的方式插入。
·Enumerated
在声明属性时,可以限制属性的取值只能从一个列表中选择,这类属性属于枚举类型。枚举类型的属性有时候是很有用的,例如:person元素有一个sex属性,我们希望这个属性的取值只能是male或female,在声明属性时,将这两个值放到圆括号中,并用竖线(|)分隔,如下所示:
<!ATTLIST person sex (male|female) #REQUIRED>
列表中的可选属性值,不用加双引号(“)或单引号(‘),但是在给属性赋值时,需要带上双引号或单引号,另外要注意的是,在给属性赋值时,不仅必须使用枚举类型声明中的可选值,而且还要注意属性值的大小写,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类型属性值相匹配。
·ENTITY,ENTITIES
ENTITY类型的属性把外部的二进制ishuju链接到文档。
ENTITY类型的属性值是在DTD中声明的未分析的一般实体的名称。
例如:我想在文档中包含一幅外部的图像,可以声明一个ENTITY类型的属性来引入图像,如下:
<!ATTLIST image src ENTITY #REQUIRED>
在DTD中,还需要声明一个外部的一般实体:
<!ENTITY logo SYSTEM “http://www.sunxin.org/logo.gif ” NDATA gif>
关键字NDATA表示该实体是一般未分析的实体,后面的gif是记号名称(notation name),说明实体的数据格式或指定一个外部的处理程序,记号gif的声明如下:
<!NOTATION gif SYSTEM “iexplore.exe”>
在XML文档中,可以在src属性中引用图像:
<image src=”logo”/>
这句代码将http://www.sunxin.org/logo.gif文件与image元素关联在一起。
·ENTITIES类型和IDREFS类型的使用是类似的,它的值是多个以空格分隔的ENTITY类型的属性值。
例如:我们可以再添加一个实体声明:
<!ENTITY banner SYSTEM http://www.mybole.com.cn/banner.gif NDATA gif>
然后将元素image的属性声明改为:
<!ATTLIST image src ENTITIES #REQUIRED>
在XML文档中,通过src属性引用两幅图像:
<image src=”logo banner”/>
·NMTOKEN,NMTOKENS
NMTOKEN(name token),名称标记是任何命名字符的混合体。
NOTOKEN类型的属性值是受限制的文本,只能包含名称字符,不能包含空白字符。
XML名称不能以除字母,下划线和冒号之外的其他字符开头,而名称标记没有这个限制。
所有的XML名称都是名称标记,但不是所有的名称标记都是XML名称。
NMTOKENS类型与IDREFS和ENTITIES类似,它的值由多个名称标记构成,每个名称必须是有效的名称标记,它们之间以空格分隔.
有时候,你可能会用NMTOKEN类型的属性来让用户输入特定的值,但是要注意的是:在使用NMTOKEN类型的属性时,其值是否有效,需要文档的作者自己去保证,XML处理器只能确保名称是否合法的(也就是检查名称中有没有空格),而不会检查值的有效性。
·NOTATION
NOTATION类型属性的值就是在记号声明中的名称。
记号声明
·在现实用,有很多数据都是无法用XML来表示的,例如:声音,图像,影像等,对于这些数据,XML处理器通常都不支持。
·通过DTD的记号声明(notation declaration),为非XML数据描述一种可能的格式,或者指定一个外部的处理程序。
·记号声明有两种形式,一般是使用MIME类型,形式如下:
<!NOTATION gif SYSTEM “image/gif”>
另一种是使用URI路径,指出外部处理程序的位置,如下:
<!NOTATION gif SYSTEM “iexplore.exe”>
·对于记号的声明,也可以使用PUBLIC关键字来代替SYSTEM关键字,并添加公共的名称和URI(用法类似于使用了关键字PUBLIC的外部DTD声明)。
XML Schema
XML Schema是以XML语言为基础的,它用于可替代DTD。
一份XML schema文件描述了XML文档的结构。
XML Schema语言也被称为XML Schema Definition (XSD)(XML Schema定义)。
XML Schema的作用是定义一份XML文档的合法组件群,就像DTD的作用一样,
一份XML Schema:
定义了可以出现在文档里的元素 ;
定义了可以出现在文档里的属性 ;
定义了哪些元素是子元素 ;
定义了子元素的顺序 ;
定义了子元素的数量 ;
定义了一个元素应是否能包含文本,或应该是空的 ;
定义了元素和属性的数据类型 ;
定义了元素和属性的默认值和固定值 ;