XML即为可扩展的标记语言(eXtensible Markup Language)。XML是一套定义语义标记的 规则,这些标记将文档分成许多部件并对这些部件加以标识。
XML是标记语言。理解XML,首先要理解标记。先说说HTML的标记(Markup),通俗地讲,它 就是一种用来给文本添加标记的语言。在HTML里每个标志都是有确切含义的。例如,在HTML 中,标签〈B〉的含义是要求HTML浏览器将一段文本加粗表示,而标签〈CENTER〉的含义是告 诉浏 览器将这段文本在一行的中间显示。
而XML并非象HTML那样,提供了一组事先已经定义好了的标签,而是提供了一个标准,利用这 个标准,你可以根据实际需要定义自己的新的置标语言,并为你的这个置标语言规定它特有 的一套标签。准确的说,XML是一种源置标语言,它允许你根据它所提供的规则,制定各种 各样的置标语言。
XML有两个先驱——SGML和HTML,这两个语言都是非常成功的标记语言,SGML的全称是 标准通用化标记语言,它从80年代初开始使用。正如XML一样,SGML也可用于创建成千 上万的标记语言,它为语法置标提供了异常强大的工具,同时具有极好的扩展性,因此 在分类和索引数据中非常有用。目前,SGML多用于科技文献和政府办公文件中。SGML 非常之复杂,其复杂程度对于网络上的日常应用简直不可思议。不仅如此,SGML非常昂 贵。HTML免费、简单,而且它获得了广泛的支持。它是一个非常简单的SGML语言,可以 方便普通人的使用。1996年人们开始致力于描述一个置标语言,它既具有SGML的强大功 能和可扩展性,同时又具有HTML的简单性。W3C于1998年2月批准了XML的1.0版本,一 个崭新而大有前途的语言诞生了。
1.XML允许各种不同的专业(如音乐、化学、数学等)开发与自己的特定领域有关的标记 语言。这就使得该领域中的人们可以交换笔记、数据和信息,而不用担心接收端的人是否 有特定的软件来创建数据。
2.XML具有较好的保值性.过去40年来的大多数计算机数据都丢失了,不是因为自然损害或 是备份介质的磨损,而只是因为没有人来写出如何读取这些数据介质和格式的文档。以不常 用的格式保存的二进制数据,数据也许会永远地消失了。XML在基本水平上使用的是非常简 单的数据格式。可以用100%的纯ASCII文本来书写,也可以用几种其他定义好的格式来书 写。ASCII文本是几乎不会"磨损"的。
3.应用间交换数据.由于XML是非专有的并易于阅读和编写,就使得它成为在不同的应用间交 换数据的理想格式.XML使用的是非专有的格式,不受版权、专利、商业秘密或是其他种类的 知识产权的限制。XML的功能是非常强大的,同时对于人类或是计算机程序来说,都容易阅 读和编写。因而成为交换语言的首选。
此外,相对于HTML,XML具有先天的优越性。
为了自己的浏览器增加一些特殊的显示效果,HTML加入了一些特殊的标记。日益增多的标签 不但使HTML越来越庞大,浏览器的开发越来越复杂,还降低了不同浏览器之间的兼容性。 尽管HTML的标签越来越多,其显示力却还远远不够。如果你希望非常精确地表现一些你自 己的数据,可能你需要一些现在在HTML中尚不存在的标签。现在HTML内部结构的条理性越 来越差。你写的HTML文件,甚至是那些专门的所见即所得工具自动生成的HTML文件,可能 在语法上会错误百出,不过没关系,浏览器照样能读它。
现在有了XML,你终于可以自由地制定你自己的置标语言,而不必再念念不忘微软、 Netscape、W3C的首肯了。实际上,现在许多行业、机构都利用XML定义了自己的置标语 言。比较早而且比较典型的是下面两个实例:
- 化学置标语言CML (Chemistry Markup Language)
- 数学置标语言MathML (Mathematical Markup Language)
现在让我们考察一个简单的XML文档:
<?xml version="1.0" standalone="yes"?> <FOO> Hello XML! </FOO> |
第一行是XML声明:
<?xml version="1.0" standalone="yes"?> |
这是XML处理指令的例子。处理指令以<?开始,而以?>结束。在<?后的第一个单词是处理 指令名,在本例中是xml。
XML声明有version和standalone两个特性。特性是由等号分开的名称-数值对。位于等号 左边的是特性名,而其值位于等号的右边,并用双引号括起来。每一个XML文档都以一个XML 声明开始,用以指明所用的XML的版本。在上例中, version特性表明这个文档符合XML 1.0 规范。XML声明还可以有standalone特性,这告诉我们文档是否在这一个文件里还是需要从外 部导入文件。在本例中,以及在以后的几章中,所有的文档都在一个文件里完成,因而 standalone特性的值要设置为yes。
再看剩下三行。总体上说,这三行组成了FOO元素。分开说,<FOO>是开始标记,而</FOO> 是结束标记,Hello XML!是FOO元素的内容。读者可能要问,<FOO>标记的意义是什么? 回答是"你要让它是什么就是什么"。除了几百个预定义的标记之外,XML还允许用户创建 所需的标记。因而<FOO>标记可以具有用户赋于的任何意义.同一个XML文档可以用不同的 标记名编写,如:
<?xml version="1.0" standalone="yes"?> <GREETING> Hello XML! </GREETING> |
或是:
<?xml version="1.0" standalone="yes"?> <P> Hello XML! </P> |
标记有三类意义:结构、语义和样式。结构将文档分成元素树。语义将单个的元素与 外部的实际事物联系起来。而样式指定如何显示元素。
结构只是表达文档的形式,而不管单个标记和元素间的差别。它们都指定文档具有一个 非空的基本元素。标记的不同名称没有结构上的意义。语义的意义存在于文档之外,在 作者的心中或是读者或是某些生成或读取这些文件的计算机程序中。例如,理解HTML但 不理解XML的Web浏览器,可能会将段落的意义赋给<P>和</P>标记。讲英语的人可能会 比<FOO>和</FOO>或<P>或</P>更容易理解<GREETING>和</GREETING>或是 <DOCUMENT>和</DOCUMENT>的意义。
正如"美丽"的意义存在于观察者心中。自然地,使标记的名称能够尽可能反映其包含的意 义更好一些。许多学科,如数学和化学正在创建该学科的工业标准和标记集。
可以与标记相联系的第三类意义是样式意义。样式意义指定标记的内容如何在计算机屏幕 上或是其他输出设备上展示。样式意义说明特定的元素是否是用粗体、斜体、绿色的24磅 的字体还是其他字体加以表示。计算机在理解样式时比理解语义意义要好一些。在XML中, 样式意义是通过样式单来施加的。(以后将会提到)
xml文件包括三部分:XML声明、处理指示(可选)、XML元素。XML文档的一个基本 要求是形式良好的(well formed),一个形式良好的XML文档要包含这三个部分。
下面是一个完整的xml文档(程序1.1):
<?xml version="1.0" encoding="gb2312" ?> <?xml-stylesheet type="text/xsl" href="mystyle.xsl"?> <学生花名册> <学生> <名字>李华</名字> <籍贯>河北</籍贯> <年龄>15</年龄> <电话号码>62875555</电话号码> </学生> <学生> <名字>张三</名字> <籍贯>北京</籍贯> <年龄>14</年龄> <电话号码>82873425</电话号码> </学生> </学生花名册> |
处理指示是用来给处理XML文件的应用程序提供信息的。所有的处理指示应该遵循 下面的格式:
<?处理指示名 处理指示信息?> |
例如这个处理指示:
<?xml-stylesheet type="text/xsl" href="mystyle.xsl"?> |
指定与了XML文件配套使用的样式单的类型为xsl及文件名为mystyle.xsl:
元素是XML文件内容的基本单元。从语法上讲,一个元素包含一个起始标记、 一个结束标记以及标记之间的数据内容。其形式是:
<标记>数据内容</标记> |
另外,元素中还可以再嵌套别的元素。比如数据内容可再扩展为
<标记1>数据内容1</标记1> <标记2>数据内容2</标记2> ... <标记n>数据内容1</标记n> |
元素里还可以再嵌套元素,实现循环嵌套。最外层的元素称为根元素。一个xml文档 只能有一个根元素。
一对标记之间出现的字符数据可以是任何合法的UNICODE字符,但不能包含字符"〈"。 这是因为,字符"〈"被预留用作标记的开始符。
在XML中,起始和结束标记之间出现的所有合法字符都被忠实地传给XML处理程序。 为了避免把字符数据和标记中需要用到的一些特殊符号相混淆,XML还提供了一些有用的 实体引用。实体引用的作用是,当在字符数据中需要使用这些特殊符号时,我们采用它的 实体引用来代替。这些特殊的XML实体引用包括:
> > < < & & " " ’ ' |
这样,如果我们需要在"示例"这个标记中出现文本
"<姓名>张三</姓名>" |
正确的写法应该是:
〈示例〉<姓名>张三</姓名>〈/示例〉 |
容易理解,字符"〈"的实体引用是必不可少的,为"〉"设立实体引用同样是为了避免与 标记混淆,而字符"&"的实体引用则防止它与实体引用中开头所用的"&"相混淆。那么, 我们什么时候需要用到剩下两个字符的实体引用呢?在标记中可以为标记设立属性, 而XML规定属性值必须用"""括起来。因此,当属性值中出现字符"""时,需要将它 用实体引用代替。请看下面的例子:
<STATEMENT VALUE = "She said, "Don t go there!""> |
正确的写法应该是:
<STATEMENT VALUE = "She said, "Don't go there!""> |
正如我们开篇所讲,标记是XML语言的精髓。因此,标记在XML的元素中、乃至整个XML 文件中,占了举足轻重的位置。
XML的标记和HTML的标记在模样上大体相同,除了注释和CDATA部分以外,所有符号〈 和符号〉之间的内容都称为标记。其基本形式为:
〈标记名 (属性名="属性取值")*〉 |
不过,XML对于标记的语法规定可比HTML要严格得多。
- 大小写有所区分
在标记中必须注意区分大小写。在HTML中,标记〈HELLO〉和〈hello〉是一回事,但 在XML中,它们是两个截然不同的标记。 - 要有正确的结束标记
结束标记除了要和开始标记在拼写和大小写上完全相同,还必须在前面加上一个斜杠 "/"。因此,如果开始标记是〈HELLO〉,结束标记应该写作〈/HELLO〉。XML严格 要求标记配对,因此,HTML中的<BR>、<HR>的元素形式在XML中是不合法的。不过, 为了简便起见,当一对标记之间没有任何文本内容时,可以不写结束标记,而在开始 标记的最后惯以斜杠"/"来确认。这样的标记称为"空标记"。例如,HTML中的标记 〈HR〉在XML中的使用方式应该是:<HR/>。 - 标记要正确嵌套
在一个XML元素中允许包含其它XML元素,但这些元素之间必须满足嵌套性。 - 有效使用属性
最后要指出的是,标记中可以包含任意多个属性。在标记中,属性以名称/取值对出现, 属性名不能重复,名称与取值之间用等号"="分隔,且取值用引号引起来。例如:<商品 类型 = "服装" 颜色 = "黄色">
在这个例子中,"类型"和"颜色"是标记"商品"的属性,"服装"是属性"类型"的 取值,"黄色"是属性"颜色"的取值。
需要特别注意的是,在XML中属性的取值必须用引号引起来,而在HTML中这一点并不 严格要求。
正象我们前面所说,我们可以把XML文件中除标记以外的所有内容都看作是字符 数据,而把标记中的所有内容都看作置标。不过,也有一个例外。在一个特殊的 标记CDATA下,所有的标记、实体引用都被忽略,而被XML处理程序一视同仁地 当作字符数据看待。CDATA的形式如下:
〈![CDATA[ 文本内容 ]]〉 |
聪明的读者可能已经猜出,CDATA的文本内容中是不能出现字符串"]]〉"的, 因为它代表了CDATA数据块的结束标志。
在前面讲字符数据时,我们谈到过实体引用。可想而知,当你的文本数据中包含 大量特殊符号时,你不得不通篇地使用实体引用,把本来很清晰的一段文字搞得 乱七八糟。例如,我们要在"示例"元素中放入了一个这么XML程序。
<联系人> <姓名>张三</姓名> <EMAIL>zhang@aaa.com</EMAIL> </联系人> |
这时,如果没有CDATA,那么麻烦来了。这个元素需要写成下面的样子:
<示例> <联系人> <姓名>张三</姓名> <EMAIL>zhang@aaa.com</EMAIL> </联系人> </示例> |
哇,你要把所有的标记都用实体引用改写,最后写出来的东西连你自己都看不懂了。 为了避免这种不便,你可以把这些字符数据放在一个CDATA数据块中,这样不管它 看上去是一个标记还是一个实体引用,这些数据统统被当作字符照单全收。于是, 上面的元素就可以写为这个样子:
<示例> <![CDATA[ <联系人> <姓名>张三</姓名> <EMAIL>zhang@aaa.com</EMAIL> </联系人> ]]〉 〈/示例〉 |
清楚多了吧!
<p>象前一节的例子中那样,有些时候,你希望XML处理器能够把你在数据中引入的 标记当作普通数据而不是真正的标记来看待。这时,CDATA为你助了一臂之力。 另外还有些时候,就象在程序中引入注释一样,你可能希望在XML文件中加入一 些用作解释的字符数据,并且希望XML处理器不对它们进行任何处理。这种类型 的文本称作注释(COMMENT)文本。</p>
在HTML中,注释是用"〈!--"和"--〉"引起来的。在XML中,注释的方法完全 相同。因此,下面是一个合法的XML(但不是形式良好的)文件: <示例>
<!-- 一个XML的例子 --> <![CDATA[ <联系人> <姓名>张三</姓名> <EMAIL>zhang@aaa.com</EMAIL> </联系人> ]]> </示例> |
不过,在XML文件中使用注释时,同样要遵守几个规则:
在注释文本中不能出现字符"-"或字符串"--",XML处理器可能把它们和注释结尾 标志"-->"相混淆。
不要把注释文本放在标记之中。类似地,不要把注释文本放在实体声明中,也不要 放在XML声明之前。记住,永远用XML声明作为XML文件中的第一行。
注释不能被嵌套。在使用一对注释符号表示注释文本时,要保证其中不再包含另一 对注释符号。例如下面例子是不合法的:
<!-- 一个XML的例子 <!--以上是一个注释--> --> |
最后再重申一遍,XML处理器对于注释中的一切内容都会视而不见,注释中出现的 标记也一同被忽略。
为了使一个文档"形式良好",XML文档中的所有置标和字符数据必须遵守前几节中给出 的规则。而且有几条关于如何把置标和字符数据相互联系起来的规则。 这些规则总结如下:
- 文档的开始必须是XML声明。
- 含有数据的元素必须有起始标记和结束标记。
- 不含数据并且仅使用一个标记的元素必须以/>结束。
- 文档只能包含一个能够包含全部其他元素的元素。
- 元素只能嵌套不能重叠。
- 属性值必须加引号。
- 字符<和&只能用于起始标记和实体引用。
- 出现的实体引用只有&、<、>、'和"。