经过两天的奋战,终于把xml简略的过了一遍。
1.1XML介绍
xml是Extensible Markup language的简写,是可扩展的标识语言。xml实际上就是一种定义语言,用户可以自己定义数据的类型,也可以创建结构化数据库,还可以对其中的数据进行筛选和排序。
1.1.1 什么是XML
xml与html十分相似,都是标记性语言,都是使用标签来描述数据,但是XML的标签可以自己定义。
1.1.2 XML的作用
xml的主要作用是建立数据和管理数据。xml也可以看成是一个小型的数据库,甚至在对数据的处理在某些方面比某些数据库里的数据处理更加灵活。简单点说,xml是一种标记性语言,是一个跨平台的,独立于硬件与软件的描述数据的工具,其作用是存储、传递和交换数据。
1.1.3简单的xml文件
xml是由根元素和树形结构来描述数据,而一个完整的xml文件还必须加上一个xml声明,其它软件就可以根据这个声明判断得到这个文件是一个XML文件。声明的格式如下:
<?xml version = "1.0" encoding = "gb2312" ?>这就是一个最基础的声明,这里我们需要注意的是encoding编码。这里一般我们所使用的都是UTF-8这里需要注意,如果你是在用记事本编写这个代码的时候,你必须将他的编码格式进行变化。
1.1.4浏览XML文件
我们所使用的主流浏览器都支持XML文件,当我们使用IE 或者是 火狐 打开这个文档的时候,我们能够看得到树形数据结构,而当我们使用Netscape 和 Opera浏览器打开这个文件时, 就会只能看得到其中的数据,而不能比较直观的看得到里面的结构。
1.2设计XML
xml虽然没有规定标签,可以由用户自己创建标签,但是XML对结构的要求十分严谨,在设计XML文件时一定要遵守其结构规则。
1.2.1XML文件结构
一个完整的XML文件可以分为声明区、定义区与数据区3个部分。
1.2.2声明区
声明区必须是整个XML文件的第一行,声明区使用的是<??>标签,该标签没有结束标签。而对这个声明区的组成部分这里有一个分解:
xml:表示这是一个XMl文件,其中xml一定要用小写来表示。
version = "1.0": 指定该XML文件是遵守XML1.0的规范来进行制作,其中version也必须使用小写字母,并且XMl的版本号"1.0"也必须放在引号内。
encoding="gb2312": 声明XML文件是使用gb2312编码编写的,即简体中文。但是一般我所使用的更多的貌似是UTF-8,所以这里我们能根据自己的需求进行更改。
1.2.3数据区
即数据存放的区域。
1.2.4 定义区
在XML文件的声明区与数据区之间的是定义区,定义区也叫做DTD(Document Type Definition),定义区的作用是设置文件的格式或标签的相关性。定义区必须包含在<!DOCTYPE[]>区域内。DTD可以直接写在XML文件内部,也可以通过引用放在XML文件的外部,与CSS和HTML相类似,DTD中声明的标签与数据区的标签都是相互对应的,当然,XML文件使用了DTD之后,该文件中的标签就必须遵守DTD中的规范,这个规范包括标签出现按的次序、标签的大小写和标签的数据类型等。另外还有XML Schema 这个也是正在逐年的取代DTD的趋势,这个比DTD更难,但是更加的精确。
1.3XML语法
XML对语法的要求很严格,在学习XML之前必须先了解XML的语法规则,只有了解了XML语法规则之后,才能创建正确的XML文件。
1.3.1标签与空标签
首先,XML的标签必须是成对出现的,有开始标签就必须有结束标签,否则浏览器就会不能正常的解析这个XML文档。当然,在XML文件中当然少不了空标签的存在。
1.3.2区分大小写
这一点和HTML中有一些不同,XML是一种区分大小写的语言,也就是对大小写敏感。
1.3.3设置属性
在HTML里,很多元素都有自己的属性,在XML中当然也是少不了这么一个功能了,在XML中,也可以为自己定义的标签设定属性,而且设定属性的方法和HTML中是一样的。
1.3.4特殊字符
在XML里,由于标签里常用到"<"、">"、" ' ' "等含有特殊含义和作用的字符,所以这里我们引入了特殊字符。例如:空格 : < : < > : > 这一些带有一些特殊意义的字符来进行使用。
1.3.5CDATA标签
在xml里有一个特殊的标签,任何软件都会把放在这个标签里的内容当成是纯文字,对这个标签的内容不做任何分析和处理,因此在这里可以放置任何的元素都不用进行转义。CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束:这也就是CDATA的语法使用规则。
1.3.6标签嵌套
与HTML相似,XML中的标签也是可以进行嵌套的,XML的嵌套必须是有层次的嵌套,不可以重叠交叉嵌套。
1.3.7注释
一个良好的程序,都会有比较详细的注释,详细的注释可以增加程序的可读性,也便于日后的修改。<!--和-->标签来插入注释内容。当然注释可以是单独的一行,也可以是一个区域,这样也就很明显的实现了注释内容。
1.4数据结构定义
数据结构定义又称之为DTD(Document Type Definition)。DTD是用来定义XML中标签、属性以及标签之间的关系。DTD可以写在XML文档的内部,此时DTD是写在XML的定义区,DTD也可以独立于XML文件作为一个DTD文件存在,此时XML可以通过指向DTD的链接来指定使用哪个DTD文件,但是这里只能使用一个DTD文件,而Schema则可以使用多个这也是DTD的一个比较重要的一个缺陷。通过DTD可以检测XML的结构是否正确,但是创建一个XML文件时并不一定需要DTD。
1.4.1内部DTD声明方法
内部DTD是将DTD的内容写在XML文件内部,DTD的定义方法如下:
<!DOCTYPE 根元素名称 [定义内容]>
其中定义内容通常有两种方法,第一种用于定义有子节点的标签,定义方法如下:
<!ELEMENT 标签名 (子标签名,子标签名,......)>
第二种用于定义只有内容的节点的标签,即没有子节点的标签,定义方法如下:
<!ELEMENT 标签名 (数据类型) >
这是DTD的内部声明方法。
1.4.2外部DTD声明方法
DTD除了可以在XML文件内部使用之外,还可以独立于XML而存在,如果XML需要引用该DTD文件,只需要使用以下代码就可以将外部DTD文件包含到XML文件内部。
<!DOCTYPE 根元素名称 SYSTEM "DTD 文件URL" >
不过由于外部DTD文件是独立于XML文件而存在的,所以使用外部DTD时会有两个文件,一个是XML文件,另一个是DTD文件。
注意:DTD文件的扩展名不一定要用.dtd,可以是任何形式的扩展名,但是为了标准的统一,笔者还是建议统一使用.dtd 为扩展名。
1.4.3内外部DTD结合声明方法
使用外部DTD声明方法可以让多个XML文件使用同一个DTD文件。但是,处理使用外部DTD声明方法之外,XML文件还支持外部DTD与内部DTD文件结合使用的生命方法。注意:使用内外部DTD结合的生命方法可以在原有的外部DTD文件标签之外追加标签,但是不能重复定义外部DTD文件里已有的标签。
1.4.4格式正确的XML文件
在文章的一开始,笔者就不断的强调,XML文件的格式与结构都是十分严谨的。那么,一个格式正确的XML文件必须满足以下的几个条件:
1) XML文件的第一行必须是类似于"<?xml version = " 1.0" encoding = " gb2312" ?>"的XML声明。
2)XML文件里有且只有一个根元素。
3)XML文件里的所有标签都必须成对出现,有开始标签就必须要有结束标签。
4)如果开始标签与结束标签之间没有任何文字,可以简写为" <标签名 /> " 形式。
5)标签可以有属性,所有属性值必须用引号括起来。
6)XML文件是区分大小写的。
7)在XML文件里如果出现特殊文字,必须转义之后再放在XML文件中。
8)XML文件里的标签可以嵌套使用,但不能交叉重叠。
1.4.5有效的XML文件
如果一个XML文件中包含DTD声明,那么这个XML文件称之为Validating XML 文件,即有法可依、有效的XML文件。一个Validating XML文件必须满足的条件如下所示:
1)Validating XML文件必须 是一个Well-Formed XML 文件。
2)Validating XML文件必须包括DTD声明。
3)Validating XML文件只能使用DTD声明中的标签,标签的出现次序也必须与DTD中声明的一样。
满足这些条件的话,就是一个有效的XML文件。
1.5 标签类型
在DTD定义区里定义XML文件里的标签时常用到类似于" <!ELEMENT 书名(#RCDATA) "的语句,在该语句里的 "#PCDATA " 就是一个标签类型,不同的标签可以设为不同的标签类型。
1.5.1#PCDATA类型
#PCDATA 类型可以说是在XML里使用得最多的数据类型,该数据类型代表文字数据。将标签设置为#PCDATA 类型的代码如下:
<!ELEMENT 标签名称 (#PCDATA)>
如果一个标签的数据类型为#PCDATA 类型,那么这个标签则不能再包含其他标签,只能包括文字。例如:
<!ELEMENT 计算机系列 (书名,出版社,作者,价格 )>这就是这么一个带类型的标签实例。
1.5.2EMPTY类型
EMPTY类型的标签是空标签,将标签设置为EMPTY类型的方法如下:
<!ELEMENT 标签名称 EMPTY>
注意:将标签设置为#PCDATA 类型时," #PCDATA " 要用圆括号括起来,而将标签设置为EMPTY 类型时,不需用圆括号括起来。当一个标签被设置为EMPTY类型之后,可以使用 " <标签名 /> " 的简写方式来替代 " <标签名> </标签名> " 的写法。
1.5.3 ANY类型
ANY类型的标签是一个自由的标签,在这个标签内部的子标签可以任意的排放位置,不用再按规定的次序出现,通常ANY 类型 都用在根元素标签上。
注意:即使将根元素设为ANY类型,在数据区里也不能出现在定义区中没有定义的标签,否则只能是Well-Formed文件而不是Validating 文件。
使用方法同上面的类型相同。
1.5.4嵌套的标签声明
XML文件是以树形结构为基础来描述数据的,除了根元素可以包含子标签之外,任何一个标签都有可能会包含其他的子标签,这就是XML标签的嵌套。既然XML标签都可以嵌套,那么用于声明XML标签的DTD,应该也能嵌套使用。例如:
首先,声明一个包含了4个子标签的根元素,
<!ELEMENT 计算机系列 (书名,出版社,作者,价格) >
这就是一个基本的嵌套生成,那么如果他的子标签还会有着嵌套呢?
这个时候,我们就能直接写出它的子标签所嵌套的标签。
<!ELEMENT 出版社 (出版社名,邮编,地址) >
这样在DTD文档中就能比较完善的把这个XML文档所需要的一些东西进行定义约束。
后面我们就是只需要将这个文档里面的其他子标签进行定义之后即可。
1.5.5混合标签的声明
在XML的标签嵌套里允许文字狱标签的混合使用。也就是在一个标签里面,既含有文字,又含有子标签的类型。另外在标签的定义的时候我们也是有着属性次数的出现。
| : 多选其一
* : 出现零次或者是多次
+: 一次或者是多次
无: 必须出现而且只能出现一次
1.6实体
在XML文件中的实体类似于很多程序中的常数,可以用来代表一些常用的数据,定义了实体之后,在XML文件中就可以通过实体名来引用这个常数,使用实体的好处是一次设定多处使用,一旦实体的值需要修改,也只要修改定义实体的部分即可,不需要逐个文件去修改。
1.6.1内部实体
实体的声明也是在XML文件的定义区声明,如果实体是在内部DTD中声明的,就称为内部实体,实体声明的语法如下所示:
<!ENTITY 实体名 " 实体值 ">而在XML文件中引用实体的方法如下所示:
&实体名称;
1.6.2外部实体
当XML文件使用的是外部DTD声明方法,那么在外部DTD里声明的实体就是外部实体,
大概的调用以及使用方法与内部实体大体上是相同的。
1.6.3 在DTD声明中使用实体
在DTD中声明的实体不但可以在数据区里使用,还可以在DTD中使用,其调用方法与在数据区中调用方法一样。
注意:在声明区不能循环引用实体,既不能存在实体A引用实体B,实体B反过来引用实体A的现象。
1.6.4参数型实体
前面介绍的实体,都是在数据区里引用,或在声明实体时引用另一个实体,那么在定义标签时,能不能使用实体呢?答案是可以的。在定义标签时引用实体,这种方式称为参数型实体。使用参数型实体与使用普通实体有些不同,普通实体可以在内部DTD中使用,也可以在外部DTD中使用,而参数型实体只能在外部DTD中使用。
参数型实体定义方式为:
<!ELEMENT % 实体名称 " 实体值 " >
而引用的方式为:
%实体名称;
注意:参数型实体只能在外部DTD文件里,作为标签的参数被引用,不能在XML的数据区里引用。
1.6.5 实体的混合使用
实体既可以在内部DTD里声明,也可以在外部DTD里声明,由于内外部DTD可以混合使用,所以实体也可以混合使用。同样,和CSS一样,内部的使用优先级大于外部的使用优先级。
1.7标签属性
与HTML代码一样,XML代码中的标签也可以设置属性,属性是标签的附加说明,通常使用程序或软件来读取。
1.7.1 标签属性的介绍
在XML文件里的标签都是由开发者根据需要自己创建的,但这些标签也可以拥有自己的属性以及属性值,当然,这些属性与值也是开发者根据自己的需要而创建的。
1.7.2设置标签属性
如果一个标签里还包含了属性,那么在使用DTD设置标签类型时,还必须为该标签生命属性,否则就不是一个Validating 文件了,设置标签属性的语法为:
<!ATTLIST 标签名 属性名 类型 " 默认值 ">
1.7.3标签属性的类型
标签属性拥有三个不同的类型,分别为:#REQUIRED、#IMPLIED 和 #FIXED, 这三个类型说明了标签的不同用法。标签属性类型在定义标签属性时使用,通常放在标签属性定义的最后。
#REQUIRED 类型说明的该标签属性是一个不能省略的属性,只要标签存在,该属性就一定要出现。不过将一个属性类型设为#REQUIRED时,就不能再为其设置默认值,
#IMPLIED 类型说明该标签属性是一个可有可无的属性,需要时可以制定该标签的属性,不需要时,也可以将其省略。将一个属性类型设为#IMPLIED类型的属性,就不能再为其设置默认值。
#FIXED 类型说明该标签属性是一个固定值,设置该属性类型之后,就不需要在标签里再设置该属性了,在浏览器中打开的时候会将里面的属性打印出来 。
1.7.4标签属性值的数据类型
在前面例子中所有标签属性值的类型都是CDATA , CDATA类型是文字类型,设为CDATA类型的属性可以是任何文字,包括英文、中文和数字。
而标签的属性类型不仅仅可以为CDATA,还可以是NMTOKEN ,NMTOKENS ,ID,IDREF,IDREFS,ENTITY,ENTITES 几种类型。标签属性的类型的具体含义如下所示:
1)CDATA: 文字类型,可以为任何文字,包括英文、中文、数字、空格、标点等。‘
2)NMYOKEN : 文字类型,但只能是英文字母、数字或者是几种常用符号,文字之间不能包括空格。
3)NMYOKENS:文字类型,可以包含的文字与NMYOKEN相同,除此之外,还可以包括空格。
4)ID : 文字类型,与CDATA的用法相同,但是在同一个XML文件中,不能同时出现相同的属性值。
5)IDREF : 文字类型,不过这种数据类型比较特殊,只能用同一个XML文件中的其他ID类型的标签属性的属性值作为自己的属性值。
6)IDREFS : 文字类型,与IDREF类型类似,不过IDREF类型只能引用一个ID标签属性值作为自己的属性值,而IDREF可以引用多个ID标签属性值作为自己的属性值。
7)ENTITY:外部实体类型,使用该类型的标签属性必须用一个外部实体来当作属性值。通常用来处理二进制文件。
8) ENTITYS:同样,是ENTITY的复数形式而已。
1.7.5 指定标签属性值范围
在声明标签属性时,可以指定标签属性值的范围,当在XML数据区里使用标签属性时,就只能在这个范围内选择属性值,其语法代码如下:
<!ATTLIST 标签名 属性名 (属性值1 | 属性值 2| 。。。 " 默认值 ">
1.7.6处理XML文件中的空格
XML文件中经常会出现一些如空格、Tab键、空白行等特殊字符,在一些应用程序中不能很好的处理这个地方。
所以在XML中,有一个特定的属性:" xml:space " , 该属性用来控制XML文件中的空格的处理方式。 当 其属性值 为 " default " 是,XML文件中的空格由应用程序控制如何处理,这也是该属性的默认值。当属性值为preserve 时,XML文件中的空格将会成为文件中的文字。
1.8命名空间
由于XML可以由开发者随意定义标签名称,在多人联合开发时,有可能会出现标签的命名冲突,命名空间就是用来解决命名冲突的一种方法。
1.8.1使用标签前缀解决命名冲突
即在标签的前面加上一个命名空间。
1.8.2命名空间
W3C的命名规范声明命名空间本身就是一个统一资源标识符(URI),URI是一个标识网络资源的字符串,最常用的URI就是URL。URL用于标识网络主机的地址,可以说是在网络上唯一的命名方式,通常都使用URL来标识命名空间,另外还有一个不常用的URI,称之为URN 也可以用来标识命名空间。
声明命名空间的语法如下:
<标签名 xmlns: 前缀名 = " 命名空间 " >
当然,一个标签中可以有多个命名空间前缀声明。
由于命名空间是以属性的形式出现在标签里,因此在xml的定义区里,还要对这个属性进行声明。
1.8.3 内定命名空间
在XML里还可以使用内定声明方式来声明命名空间。
1.9小结
XML是可扩展的标识语言,主要作用是数据的建立和管理,可以当作一种通用的数据库来使用,也能使用不同的应用程序来读取XML里的数据,一个完整的XML文件可以分为声明区、定义区和数据区3个部分。声明区的作用是声明该文件为XML文件,数据区是数据存放的区域,定义区的作用是设置文件的格式或标签的相关性。
好了,XML的一些比较基础的就谈到这里,下一节笔者觉得更难,更需要懂的。