XML是W3C在1996年底提出的标准,是从SGML衍生出来的简化格式,也是一种元语言(meta-language),可以用来定义任何一种新的标示语言。XML的制定是为了补HTML的不足,使得在Web上能够传输、处理各类复杂的文件,它舍去了SGML复杂不常用及不利于在Web传送的选项功能,让使用者可以很容易地定义属于自己的文件型态,程序设计师也能在更短的时间开发XML相关应用程序。XML1.0 Recommendation于1998年2月公布,相关标准目前仍在发展之中,XML的发展获得了各界的支持,其中包括了Sun Microsystesms, Microsoft, Netscape, Adobe, ArborText...等软件大厂。
XML的发展背景主要是因为HTML的诸多限制已经影响了Web的发展,XML的发展成员大都对SGML及结构化的信息(structured information)有相当丰富的应用经验,他们相信引进SGML技术,能够弥补HTML的不足,对Web的发展能有以下几个方面的贡献:
结构化信息的一个主要应用是资料交换,不同的领域可以针对领域的特性制定共同的信息内容模型(content model),并以这个共同的内容模型来标示信息,如此可以促使同领域的信息可以更容易且更有效率地交换,这个共同的内容模型,我们称之为DTD。无疑地,Web是理想的电子数据交换的媒介,但HTML并非理想的数据交换格式,也难以充分地表现各种信息内容模型与语意结构,而XML所要提供的正是一套可以在Web上承载各种结构化信息的框架。
Java技术的出现使得浏览器能成为通用的应用系统平台,但HTML固定的标签集及不擅长描述语义的特性,使得Java程序没有太大的发挥空间,而XML正好可以给予Java程序大显身手的环境,以XML做为各种结构化信息的标准格式,搭配上Java程序,可以使得应用程序大部分的运算得以在客户端执行,这和目前大部分的Web-based应用程序主要透过伺服端的CGI scripts来完成大部分的运算是相反的模式。借着XML与Java技术的结合,将应用程序的运算从伺服端移到客户端来,有助于降低网络的流量与增加网络的速度。
HTML与XML的始祖SGML提供了一套能够指定信息的结构与语义的语法规则,而且具备了平台独立性。不像Microsoft的RTF、Adobe的PostScript以及其它专属性的文件格式,SGML所提供的是一套具备平台独立性与系统独立性的语法规则。
XML文件有两种型式,一种称为Well-formed XML,另一种称为Valid XML,两者最大的差异为是否有DTD。Well-formed XML能够让使用者在Web上跨越HTML只有固定标签集(tag set)的限制,自行定义所需要的标签。Well-formed XML不像SGML与Valid XML一般,要使用自行定义的标签必须先在DTD中以严谨的语法进行宣告,而是可以直接使用。能够依据应用程序开发的需要自行定义标签,使得Web文件的处理与设计上有更大的弹性与更好的控制。
Well-formedness是XML所提出来的新概念,一份Well-formed XML文件可以很容易被计算机所读取,并在网络上传送。Well-formed文件必须遵守以下几条规则:
包含一个以上的元素(elements)。
恰有一个根元素(root),不出现在其它元素的内容之中。
所有的元素都有起始卷标与结束卷标,也就是卷标必须成对。
所有的标签必须呈现适当的巢状(nest)结构。
空卷标(empty tags)必须遵守特殊的XML语法。(如<empty/>)
所有的属性值都必须括上单引号或双引号。
所有的实体(entity)都必须宣告。
XML宣告的目的是让人在阅读时或机器在解译时能识别这是一份XML文件,尤其避免与SGML文件与HTML文件混淆。XML宣告包含了标示语言(markup language)、标示语言版本、是否呼叫外部文件及字集编码(character encoding)等信息。以下是几个Well-formed XML文件的宣告实例,第1个实例是所有的Well-formed XML文件所使用宣告;第2个实例只是第1个实例的简略写法;第3、第4个实例则指明了文件所采用的字集编码标准。
|
XML 宣 告 实 例 |
1 |
<?xml version=”1.0” standalone=”yes”?> |
2 |
<?xml version=”1.0”?> |
3 |
<?xml version=”1.0” encoding=”UTF-8”?> |
4 |
<?xml version=”1.0” encoding=”big5”?> |
下表列出了XML宣告的语法符号及保留字所代表的意义:
|
说 明 |
<? |
XML宣告的起始字符。 |
xml |
表示这是一份XML文件。 |
version |
用来指定XML的版本,默认值是 “1.0”。 |
standalone |
用来表示该文件是否呼叫其它外部的文件。若值是 ”yes” 表示没有呼叫外部文件,若值是 ”no” 则表示有呼叫外部文件。
默认值是 “yes”。 |
encoding |
指定文件所使用的字集编码,默认值是 “UTF-8”。 |
?> |
XML宣告的结束字符。 |
每一份XML文件都以一个根元素来包含所有其它的元素,以电子邮件为例,其文件结构树形图如下:
Email是根元素,包含了From, Date, To, Body, Attachment等子元素。通常根元素的命名被用来代表文件的类型。大家所熟悉的HTML文件,其根元素就被命名为html。
一份Well-formed XML文件应该有如下的型式:
<?xml version=”1.0” standalone=”yes”?>
<Email>
……
</Email> |
根据文件的类型订定根元素之后,接着就可以开始标示文件的内容,虽然Well-formed XML的元素不需透过DTD来宣告,不过在开始标示文件之前,最好还是先画出文件结构的树形图,亦即元素间的关系图。在元素的命名方面尽量使用有意义、易于理解的名称,以增加文件的可读性。
下面是一份已标示的Well-formed XML文件实例,所使用的卷标名称很容易看出所代表的意义。
<?xml version=”1.0” standalone=”yes”?>
<Email>
<From>Joe</From>
<Date>1999-4-29 AM 01:50</Date>
<To>Jay</To>
<To>Jennifer</To>
<To>Joann</To>
<Subject>Brief introduction to myself</Subject>
<Body>Dear all, I am Joe. I ’m a graduate student majored in Library
and Information Science from Fu-Jen University….</Body>
</Email> |
完成文件的标示工作之后,接下来就是检查这份XML文件是否符合Well-formed XML的语法规则。以人工逐行检查是一种方法,不过太没有效率,也容易有所疏漏。检查XML文件是否具备Well-formedness的最好方法是利用XML剖析器(parser),它可以检查出XML文件的语法错误。目前在网络上有各种免费的XML parser可以下载,Micorsoft Internet Explorer 5.0浏览器内建了一个XML剖析器,图1与图2分别是以其来浏览一份正确与一份有语法错误的XML文件所得到的结果。事实上XML文件必须搭配样式表(style sheet)才能呈现,Micorsoft Internet Explorer 5.0浏览器能够呈现纯粹的XML文件,是因为内建了XML的预设样式。
图1:一份正确的Well-formed XML文件在Microsoft Internet Explorer 5.0 的浏览结果
图2:一份有语法错误的XML文件在Microsoft Internet Explorer 5.0 的浏览结果
Valid XML文件所参照的DTD可以放在文件内部,也可以是另一份外部文件。DTD如果放在文件内部,所使用的XML宣告如下:
<?xml version=”1.0” standalone=”yes”?>
DTD如果是另一份外部文件,则所使用的XML宣告如下:
<?xml version=”1.0” standalone=”no”?>
采用Email为例子来设计其DTD,下面是电子邮件的XML DTD。
<!-- DTD for Email -->
<!-- Elements Content -->
<!-- ---------- --------- -->
<!ELEMENT Email (From,Date,To*,Subject,Body?,Attchment?)>
<!ELEMENT From (#PCDATA)>
<!ELEMENT Date (#PCDATA)>
<!ELEMENT To (#PCDATA)>
<!ELEMENT Subject (#PCDATA)>
<!ELEMENT Body (#PCDATA)>
<!ELEMENT Attachment (#PCDATA)>
<!-- End of DTD --> |
XML文件的结构定义在DTD之中,DTD通常包含了元素宣告与属性宣告:
一、元素(Element)宣告:
XML文件的语意结构是透过DTD的元素宣告来定义,电子邮件的文件结构在DTD中以下面的元素宣告来表示:
<!ELEMENT Email (From,Date,To+,Subject,Body?,Attchment?)>
下表是上述元素宣告的语法说明:
语 法 |
说 明 |
<! |
宣告的起始符号。 |
ELEMEMT |
元素宣告的保留字。 |
Email |
元素的名称。 |
(From,Date,To+,Subject,Body?,Attchment?) |
元素Email的内容,以内容模式(content model)来表达,此例的意义为:元素Email依序包含了 From, Date, To, Subject, Body, Attchment 等子元素,其中To至少有一个,Body与Attachment则可以没有或有一个以上。 |
> |
宣告的结束符号。 |
元素的内容模式(content model),除了定义所包含的子元素外,也定义每个子元素可出现的次数及出现的顺序关系。内容模式的语法如下表:
语 法 |
说 明 |
( |
内容模式定义的起始符号。 |
, |
Sequence connector;表示出现的顺序。 |
& |
And connector;必须同时出现,但没有先后次序的限制。 |
| |
Or connector;必须有一者出现,但不能同时出现。 |
* |
optional and repeatable;不出现或出现一次以上。 |
? |
optional occurrence;不出现或只出现一次。 |
+ |
required and repeatable;至少出现一次。 |
) |
内容模式定义的结束符号。 |
如果元素的内容并没有包含任何子元素,只有包含纯粹的文字数据,其元素内容以 #PCDATA来表示,如下面的元素宣告:
<!ELEMENT From (#PCDATA)>
二、属性(Attribute)宣告:
每个元素可以有一个以上的选择性或强制性的属性,用来描述元素的某种特性。属性必须在起始卷标中指定,而所有可能的值及默认值则在DTD中定义。如下例:
<!ATTLIST To …..
group (coworkers | family | friends) “coworkers”>
上述属性宣告的语法说明如下表:
语 法 |
说 明 |
<! |
宣告的起始符号。 |
ATTLIST |
属性宣告的保留字。 |
To |
欲宣告属性的元素名称。 |
group |
属性的名称 |
(coworkers | family | friends) |
列举出属性所有可能的值。(coworkers | family | friends)表示属性 group 可能的值是 “coworkers”, “family”, “friends”。 |
“coworkers” |
属性的默认值。 |
> |
宣告的结束符号。 |
如果Element没有对应的Attirbute叙述,表示该Element不具有任何属性。
(一) 撰写Valid XML文件实例:
利用前述的XML DTD就可以写一份电子邮件的Valid XML文件,下面是一份引用外部DTD的Valid XML文件
<?xml version=”1.0” encoding=”big5” standalone=”no”?>
<!DOCTYPE Email SYSTEM "C:\xml\email.dtd">
<Email>
<From>Joe</From>
<Date>1999-4-29 AM 01:50</Date>
<To>Jay</To>
<To>Jennifer</To>
<To>Joann</To>
<Subject>Brief introduction to myself</Subject>
<Body>Dear all, I am Joe….. </Body>
</Email> |
以下则是一份引用内部DTD的Valid XML文件。
<?xml version=”1.0” encoding=”big5” standalone=”yes”?>
<!DOCTYPE Email [
<!ELEMENT Email (From, Date, To*, Body?, Attchment?)>
<!ELEMENT From (#PCDATA)>
<!ELEMENT Date (#PCDATA)>
<!ELEMENT To (#PCDATA)>
<!ELEMENT Subject (#PCDATA)>
<!ELEMENT Body (#PCDATA)>
<!ELEMENT Attachment (#PCDATA)>
]>
<Email>
<From>Joe</From>
<Date>1999-4-29 AM 01:50</Date>
<To>Jay</To>
<To>Jennifer</To>
<To>Joann</To>
<Subject>Brief introduction to myself</Subject>
<Body>Dear all, I am Joe….. </Body>
</Email> |
(二) 剖析(parse)Valid XML文件:
所有的XML文件都必须符合Well-formedness,包括Well-formed XML文件与Valid XML文件。因此完成Valid XML文件的标示工作之后,接着要做的是先检查这份XML文件是否符合Well-formed XML的语法规则,在前面我们已经介绍过检查的方法了。Valid XML除了必须符合Well-formedness外,也需符合DTD所定义的文件结构。XML的剖析器(parser)分为两类,一种称为非确认性(non-validating)剖析器,只能检查XML文件是否符合Well-formedness规则,无法依据DTD进行文件结构的确认,像Micorsoft Internet Explorer 5浏览器中所包含的XML剖析器就是一个非确认性(non-validating)剖析器,因此只要所浏览的XML文件符合了Well-formedness规则,就算文件的标示与DTD的结构不符,它也不会发现任何错误。另一类剖析器称谓可确认性(validating)剖析器,它除了检查XML文件是否符合Well-formedness规则,也可以依据DTD进行文件结构的确认。
利用最简单的文字编辑器(text editor)即可撰写XML文件,不过每一对起始卷标与结尾卷标都必须自行键入。撰写XML文件较便利的方法是利用专门的XML编辑器,它可以让你定义元素名称、属性名称或实体名称,在编辑XML文件时,它以一个清楚易读的编排格式,让你能更容易地输入XML宣告、样式表类别与路径、DTD的路径及每个元素、属性的值,帮你产生起始卷标与结尾卷标。
不同的XML编辑器功能不一,除了最基本编辑的功能外,有的只能检查是
否符合Well-formedness,而不能依据DTD来作文件结构的确认;有的则可依据DTD来作文件结构的确认;在中文码的支持方面,有的可以全面支持Big5中文码,有的只有XML文件的内容部分才可以使用Big5中文码,有的则完全不支持Big5中文码。
下图是Microsoft公司的产品XML Notepad Beta 1.5,它只允许元素的内容使用Big5中文码,标签与批注的部分都不支持Big5,这个版本也不支持以DTD来进行文件结构的确认。
大部分的人都听过HTML,透过XML与HTML的比较来原本就熟悉HTML的人来说,是学习XML的好方法。XML与HTML是不同层级的标示技术,HTML是一种特定的标示语言,包含了一组标准的元素集(element set),元素用来指示特定的文字片段在文件中所扮演的角色,每一个元素都有标准的意义。例如:<H1>与</H1>在HTML文件中的意义是最重要的标题(heading)。除了HTML之外,还有很多种特定的标示语言,例如航空产业针对飞行器维护手册制定了一个标示语言称为ATA-2100,半导体产业针对电路数据制定了一个标示语言称为PCIS,计算机产业针对软件文件订了一个标示语言称为DocBook。这些特定的标示语言都有以下共同点:
●都定义了一组标签集(tag set),每个标签都有标准的意义及标准的使用规则,也就是有标准的文法(grammer)。
●都是为了某类型的文件或数据专门设计的。
●都使用文字处理(text processing)国际标准SGML来定义它们的标签集与文法。
XML继承了SGML的可扩展性(extensibility)、结构性(structure)与可确认性(validation),这三点也是XML与HTML在特性上最重要的不同,说明如下:
|
HTML |
XML |
可扩展性(extensibility) |
卷标集与每个卷标的意义是固定的,使用者无法自行定义卷标(tags)或属性(attribute)。 |
允许使用者根据需要,自行定义卷标与属性,以便更进一步描述数据的语意。 |
结构性(structure) |
不支持深层的结构描述。 |
能描述各种复杂的文件结构,如数据库纲要 (schema)及对象导向的阶层结构。 |
可确认性(validation) |
没有提供语法规格来支持应用程序对HTML文件进行结构确认。 |
可包含一个语法规格 (DTD),让应用程序对文件进行结构确认。 |
XML文件每一个起始标签都要有对应的结束卷标,成对的起始卷标与结束卷标就称为元素。每一元素都必须巢状包覆(nested within)在另一个元素之内。例如:
<LI>HTML allows <B><I>improper nesting</B></I>
上面是一段HTML原始码,但B、I并没有巢状包覆的关系,且LI没有结束标签,所以不符合XML的语法规则。
<LI>XML required <B><I>proper nesting</I></B>
上面这个例子则符合XML的语法规则,I巢状包覆在B之内,且每一个元素都有成对的起始卷标与结束卷标。
和HTML一样,XML也允许元素是空元素,所谓空元素的意思是元素的起始卷标与结束卷标是同一个。XML对于空元素的表示方法和HTML不同,必须在元素型别名称之后加上斜线(slash)。例如:下面这一段HTML原始码中,<BR>是一个空元素。
<LI>This is a HTML <BR>empty tag.</LI>
以XML的语法规则,必须表示如下:
<LI> This is a XML <BR/>empty tag.</LI>
XML这样规定的目的是使XML处理器(processor)读到 “/>” 便知道这是一个空元素,就不用再往下找结束标签了。在HTML中,HTML处理器之所以知道 <BR> 是一个空元素,是因为HTML的标签集是预先定义好的;而XML允许使用者自行定义标签,因此必须有特殊的语法来表示空元素,XML处理器才不至于搞混。
HTML除了包含空白的属性值必须以引号夹住外,其余的情况可以省略引号;而XML所有的属性值(attribute value)都必须以引号(quotes)夹住。例如:
<FONT color=#FF0000>HTML attribute value</FONT>
以上是一段合法的HTML原始码,属性值没有用引号夹住,不符合XML的语法规则。
<FONT color=”#FF0000”>XML attribute value</FONT>
上面这个例子符合XML的语法规则,属性值必须用单引号或双引号夹住。
HTML卷标大小写是一样的,XML标签大小写则有区别。例如:
<H1>HTML is not case-sensitive, XML is.</h1>
以上是一段合法的HTML原始码,在HTML中,H1与h1是相同的标签;但在XML中,H1与h1则是不同的标签。上面的HTML原始码若以XML的语法来写,就得写成
<H1>HTML is not case-sensitive, XML is.</H1>
HTML除了PRE元素内的连续空白有效外,其余的连续空白都会被视为只有一个空格符。HTML的空白包括了ASCII space( )、ASCII tab(	)、ASCII form feed()、Zero-width space(​)以及 Line breaks,这里的 &#x 表示Unicode的十六进制。而由于XML主要是用来装载数据,因此在XML卷标之间的空白都是有效的,但在卷标本身及属性值的引号之间的空白是无效的。例如:
(1)<desc lan=”English”>XML white space handling</desc>
(2)<desc lan=”English”>XML white space handling</desc>
(3)<desc lan=”English”>XML white space handling</desc>
以上三段XML原始码,(1)与(2)是相同的,但(3)与(1)(2)则不同。
这个限制使得XML剖析器较容易确认文件已经结束了。
XML的字集编码是在<?xml?>宣告中指定,例如:
<?xml version=”1.0” encoding=”UTF-8”>
上面的例子表示这份XML文件以UTF-8编码。所有符合XML规格的软件工具一定都支持ISO 10646字集,ISO 10646是一组庞大的字集,其中包含了Big5中文码及GB2312中文码中所有的字。ISO 10646包含了几种编码方式:UTF-8是8 bit的,UTF-16是16-bit的,Unicode就是UTF-16的形式。
有一些字符本身就是XML语法结构的一部份,若要在XML文件中使用这些字符必须使用替代的表示法,XML使用预先定义的实体(predefined entity)来替代这些字符,如下表:
Reserved character |
Predefined entity to use instead |
< |
< |
> |
> |
& |
& |
“ |
" |
‘ |
' |
上表中前四个字符在HTML中也使用同样的替代表示法,在HTML中称为字符实体参引(character entity references)。
2.如何将HTML文件转换成Well-formed XML文件:
要将现有的HTML文件转换成XML文件,首先要先使文件具备Well-formedness,除了要在文件的开头加上XML宣告外(<?xml version=”1.0”?>),可以依循下列四个转换步骤。
HTML的起始卷标与结束卷标在使用上,有时会被当作切换(switch on and off)的工具,其实这是不好的观念,这会使得标签出现交错的情况,例如下面不是一段合法的XML code,因为标签有交错的情况。
<b><i>bold italic font</b>italic font</i>
必须修改成有适当的巢状结构才符合XML的语法,如下:
<b><i>bold italic font</i></b><i>italic font</i>
SGML允许省略标签,只要在DTD中宣告该元素的卷标可以省略即可。在HTML 4.0 DTD中,许多标签都是允许省略的,如元素 p, ul, …的结束卷标,甚至连元素 html, body 的起始与结尾标签都可以省略。要将HTML文件转成XML文件,必须将所有省略的标签都补上。
在HTML中,属性值的引号有时会省略,特别是数字型态的属性值,在XML文件中任何型态的属性值都必须加上单引号或双引号。在HTML中,如果属性只有一种可能的值,甚至可能省略属性的名称,直接写入属性值。如 <ul compact>,在XML中必须写成 <ul compact=”compact”>。
XML对于空元素的表示有特别的格式,如下面是一段HTML原始码:
<IMG ALIGN=”RIGHT SRC=”sample.gif”>
在XML中必须表示如下:
<IMG ALIGN=”RIGHT SRC=”sample.gif”/>
W3C XML Resource http://www.w3.org/XML/
Robin Cover, The XML Cover Pages http://www.oasis-open.org/cover/
XML.com http://www.xml.com/
Microsoft XML Resource http://msdn.microsoft.com/xml/
IBM XML Resource http://www.ibm.com/developer/xml/
中研院电算中心 Chinese XML http://www.ascc.net/xml/