XML简介
XML即为可扩展的标记语言(eXtensible;Markup;Language)。XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。
XML是标记语言。理解XML,首先要理解标记。先说说HTML的标记(Markup),通俗地讲,它就是一种用来给文本添加标记的语言。在HTML里每个标志都是有确切含义的。例如,在HTML;中,标签〈B〉的含义是要求HTML浏览器将一段文本加粗表示,而标签〈CENTER〉的含义是告诉浏览器将这段文本在一行的中间显示。
;而XML并非象HTML那样,提供了一组事先已经定义好了的标签,而是提供了一个标准,利用这个标准,你可以根据实际需要定义自己的新的置标语言,并为你的这个置标语言规定它特有的一套标签。准确的说,XML是一种源置标语言,它允许你根据它所提供的规则,制定各种各样的置标语言。
XML的产生
XML有两个先驱――SGML和HTML,这两个语言都是非常成功的标记语言,SGML的全称是标准通用化标记语言,它从80年代初开始使用。正如XML一样,SGML也可用于创建成千上万的标记语言,它为语法置标提供了异常强大的工具,同时具有极好的扩展性,因此在分类和索引数据中非常有用。目前,SGML多用于科技文献和政府办公文件中。SGML;非常之复杂,其复杂程度对于网络上的日常应用简直不可思议。不仅如此,SGML非常昂贵。HTML免费、简单,而且它获得了广泛的支持。它是一个非常简单的SGML语言,可以方便普通人的使用。1996年人们开始致力于描述一个置标语言,它既具有SGML的强大功能和可扩展性,同时又具有HTML的简单性。W3C于1998年2月批准了XML的1.0版本,一个崭新而大有前途的语言诞生了。;
XML的优点
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文档:
<?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>
XML标记的意义
标记有三类意义:结构、语义和样式。结构将文档分成元素树。语义将单个的元素与外部的实际事物联系起来。而样式指定如何显示元素。
结构只是表达文档的形式,而不管单个标记和元素间的差别。它们都指定文档具有一个非空的基本元素。标记的不同名称没有结构上的意义。语义的意义存在于文档之外,在作者的心中或是读者或是某些生成或读取这些文件的计算机程序中。例如,理解HTML但不理解XML的Web浏览器,可能会将段落的意义赋给<P>和</P>标记。讲英语的人可能会比<FOO>和</FOO>或<P>或</P>更容易理解<GREETING>和</GREETING>或是;<DOCUMENT>和</DOCUMENT>的意义。
正如"美丽"的意义存在于观察者心中。自然地,使标记的名称能够尽可能反映其包含的意义更好一些。许多学科,如数学和化学正在创建该学科的工业标准和标记集。
可以与标记相联系的第三类意义是样式意义。样式意义指定标记的内容如何在计算机屏幕上或是其他输出设备上展示。样式意义说明特定的元素是否是用粗体、斜体、绿色的24磅的字体还是其他字体加以表示。计算机在理解样式时比理解语义意义要好一些。在XML中,样式意义是通过样式单来施加的。(以后将会提到)
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文件的实质内容――元素
元素是XML文件内容的基本单元。从语法上讲,一个元素包含一个起始标记、一个结束标记以及标记之间的数据内容。其形式是:
<标记>数据内容</标记>
另外,元素中还可以再嵌套别的元素。比如数据内容可再扩展为
<标记1>数据内容1</标记1>
<标记2>数据内容2</标记2>
...
<标记n>数据内容1</标记n>
元素里还可以再嵌套元素,实现循环嵌套。最外层的元素称为根元素。一个xml文档只能有一个根元素。
字符数据与实体引用
一对标记之间出现的字符数据可以是任何合法的UNICODE字符,但不能包含字符"〈"。;这是因为,字符"〈"被预留用作标记的开始符。
在XML中,起始和结束标记之间出现的所有合法字符都被忠实地传给XML处理程序。;为了避免把字符数据和标记中需要用到的一些特殊符号相混淆,XML还提供了一些有用的;实体引用。实体引用的作用是,当在字符数据中需要使用这些特殊符号时,我们采用它的;实体引用来代替。这些特殊的XML实体引用包括:
>;>
<;<
&;&
";";
’;&apos
这样,如果我们需要在"示例"这个标记中出现文本
"<姓名>张三</姓名>"
正确的写法应该是:
〈示例〉<姓名>张三</姓名>〈/示例〉;
容易理解,字符"〈"的实体引用是必不可少的,为"〉"设立实体引用同样是为了避免与标记混淆,而字符"&"的实体引用则防止它与实体引用中开头所用的"&"相混淆。那么,我们什么时候需要用到剩下两个字符的实体引用呢?在标记中可以为标记设立属性,而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中这一点并不;严格要求。
CDATA
正象我们前面所说,我们可以把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文档中的所有置标和字符数据必须遵守前几节中给出;的规则。而且有几条关于如何把置标和字符数据相互联系起来的规则。;这些规则总结如下:;
文档的开始必须是XML声明。;
含有数据的元素必须有起始标记和结束标记。;
不含数据并且仅使用一个标记的元素必须以/>结束。;
文档只能包含一个能够包含全部其他元素的元素。;
元素只能嵌套不能重叠。;
属性值必须加引号。;
字符<和&只能用于起始标记和实体引用。;
出现的实体引用只有&、<、>、'和"。;