XML学习笔记

这段时间一直在看《核心技术》的XML部分,由于这本书只是讲怎么操作xml,没有很系统的讲xml,故在图书馆借了一本关于XML的书,看完相应部分,再在网上复制各种笔记,然后自己照书写了一部分,零零散散的也算是《XML学习笔记》吧:

XML简介

XML 不是对 HTML 的替代,是对 HTML 的补充,理解这一点很重要。在大多数 web 应用程序中,XML 用于传输数据,而 HTML 用于格式化并显示数据。

对 XML 的最好的描述是:XML 是独立于软件和硬件的信息传输工具。

XML文档在逻辑上主要由以下五个部分组成。

 1XML声明

 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字符集中字符的编码)。如果用的是预定义实体引用,在和号(&)之后写上字符的助记符

字符     预定义实体引用

 <                <

 >                >

 “                "

 ‘                &apos;

 &               &

注:什么时候要使用字符引用和预定义实体应用?在一些会与定界符混淆的地方,而需要使用上述符号的时候,就使用字符引用和预定义引用来表示上述符号

字符引用:可以引用各种存在于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 文档类型定义

XMLSGML继承了用于定义语法规则的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处理器将以声明的缺省值向应用程序报告该属性。不同的是,这种声明方式属性的值是可以改变的。

注:可以将多个缺省声明合为一个,只需在上一个缺省声明后加空格,然后继续添加缺省声明。

属性类型

·在属性表声明时,总共有十种属性类型可以选择,分别是:CDATAEnumeratedIDIDREFIDREFSENTITYENTITIESNMTOKENNMTOKENSNOTATION

·CDATA

这是最常用的一种属性类型,表明属性值为字符数据,与元素内容说明中的#PCDATA相同,如果属性值需要出现小于号(<)和双引号(“),可以通过预定义实体引用或字符引用的方式插入小于号和双引号。如果包含的和号(&)不是字符或实体引用的起始定界符,也必须使用预定义实体引用或者字符引用的方式插入。

·Enumerated

在声明属性时,可以限制属性的取值只能从一个列表中选择,这类属性属于枚举类型。枚举类型的属性有时候是很有用的,例如:person元素有一个sex属性,我们希望这个属性的取值只能是malefemale,在声明属性时,将这两个值放到圆括号中,并用竖线(|)分隔,如下所示:

<!ATTLIST person sex (male|female) #REQUIRED>

列表中的可选属性值,不用加双引号(“)或单引号(‘),但是在给属性赋值时,需要带上双引号或单引号,另外要注意的是,在给属性赋值时,不仅必须使用枚举类型声明中的可选值,而且还要注意属性值的大小写,MaleMALEFemaleFEMALE等都是无效的。

·ID,IDREF,IDREFS

一个ID类型的属性值唯一标识XML文档中的一个元素。

一个ID类型的属性必须遵守XML名称定义的规则,以字母,下划线或冒号开头,名称中可以包含字母,数字,下划线以及其他在XML标准中允许的字符,名称中不能带有空格。

一个元素只能有一个ID类型的属性,ID类型的属性必须设置为#IMPLIED或者#REQUIRED,因为ID类型属性的每一个取值都是用来标识一个特定的元素,为ID类型的属性提供缺省值,特别是固定的缺省值是毫无意义的。

·IDREF类型的属性值为同一个文档中另一个元素的ID类型的属性值,而这另一个元素的ID类型的属性值必须是已经存在的。

·利用IDIDREF这两种类型的属性,我们可以在两个对象之间建立一种关联关系。

·如果一个属性需要引用文档中多个ID类型的属性值,那么可以把它声明为具有IDREFS类型。IDREFS类型的属性值是一系列以空格分隔的ID类型的属性值,而且必须与文档中已有的ID类型属性值相匹配。

·ENTITYENTITIES

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”/>

·NMTOKENNMTOKENS

NMTOKENname token),名称标记是任何命名字符的混合体。

NOTOKEN类型的属性值是受限制的文本,只能包含名称字符,不能包含空白字符。

XML名称不能以除字母,下划线和冒号之外的其他字符开头,而名称标记没有这个限制。

所有的XML名称都是名称标记,但不是所有的名称标记都是XML名称。

NMTOKENS类型与IDREFSENTITIES类似,它的值由多个名称标记构成,每个名称必须是有效的名称标记,它们之间以空格分隔.

有时候,你可能会用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:   

定义了可以出现在文档里的元素 ;   

定义了可以出现在文档里的属性 ;   

定义了哪些元素是子元素 ;   

定义了子元素的顺序 ;   

定义了子元素的数量 ;   

定义了一个元素应是否能包含文本,或应该是空的 ;   

定义了元素和属性的数据类型 ;   

定义了元素和属性的默认值和固定值 ;

 

你可能感兴趣的:(html,xml,image,System,文档,encoding)