第一章 XML的发展背景

    XMLW3C1996年底提出的标准,是从SGML衍生出来的简化格式,也是一种元语言(meta-language),可以用来定义任何一种新的标示语言。XML的制定是为了补HTML的不足,使得在Web上能够传输、处理各类复杂的文件,它舍去了SGML复杂不常用及不利于在Web传送的选项功能,让使用者可以很容易地定义属于自己的文件型态,程序设计师也能在更短的时间开发XML相关应用程序。XML1.0 Recommendation19982月公布,相关标准目前仍在发展之中,XML的发展获得了各界的支持,其中包括了Sun Microsystesms, Microsoft, Netscape, Adobe, ArborText...等软件大厂。

XML的发展背景主要是因为HTML的诸多限制已经影响了Web的发展,XML的发展成员大都对SGML及结构化的信息(structured information)有相当丰富的应用经验,他们相信引进SGML技术,能够弥补HTML的不足,对Web的发展能有以下几个方面的贡献:

1.电子数据交换(EDI):

结构化信息的一个主要应用是资料交换,不同的领域可以针对领域的特性制定共同的信息内容模型(content model),并以这个共同的内容模型来标示信息,如此可以促使同领域的信息可以更容易且更有效率地交换,这个共同的内容模型,我们称之为DTD。无疑地,Web是理想的电子数据交换的媒介,但HTML并非理想的数据交换格式,也难以充分地表现各种信息内容模型与语意结构,而XML所要提供的正是一套可以在Web上承载各种结构化信息的框架。

2.Java技术更紧密结合:

Java技术的出现使得浏览器能成为通用的应用系统平台,但HTML固定的标签集及不擅长描述语义的特性,使得Java程序没有太大的发挥空间,而XML正好可以给予Java程序大显身手的环境,以XML做为各种结构化信息的标准格式,搭配上Java程序,可以使得应用程序大部分的运算得以在客户端执行,这和目前大部分的Web-based应用程序主要透过伺服端的CGI scripts来完成大部分的运算是相反的模式。借着XMLJava技术的结合,将应用程序的运算从伺服端移到客户端来,有助于降低网络的流量与增加网络的速度。

3.携带平台独立(platform-independent)信息:

    HTMLXML的始祖SGML提供了一套能够指定信息的结构与语义的语法规则,而且具备了平台独立性。不像MicrosoftRTFAdobePostScript以及其它专属性的文件格式,SGML所提供的是一套具备平台独立性与系统独立性的语法规则。

第二章 Well-formed XML Valid XML

 XML文件有两种型式,一种称为Well-formed XML,另一种称为Valid XML,两者最大的差异为是否有DTDWell-formed XML能够让使用者在Web上跨越HTML只有固定标签集(tag set)的限制,自行定义所需要的标签。Well-formed XML不像SGMLValid XML一般,要使用自行定义的标签必须先在DTD中以严谨的语法进行宣告,而是可以直接使用。能够依据应用程序开发的需要自行定义标签,使得Web文件的处理与设计上有更大的弹性与更好的控制。

 Well-formednessXML所提出来的新概念,一份Well-formed XML文件可以很容易被计算机所读取,并在网络上传送。Well-formed文件必须遵守以下几条规则:

包含一个以上的元素(elements)。

恰有一个根元素(root),不出现在其它元素的内容之中。

所有的元素都有起始卷标与结束卷标,也就是卷标必须成对。

所有的标签必须呈现适当的巢状(nest)结构。

空卷标(empty tags)必须遵守特殊的XML语法。(如<empty/>

所有的属性值都必须括上单引号或双引号。

所有的实体(entity)都必须宣告。

1.撰写Well-formed XML文件的步骤:

1.1.撰写XML宣告(XML declaration

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宣告的结束字符。

1.2.订定一个根元素(root element):

    每一份XML文件都以一个根元素来包含所有其它的元素,以电子邮件为例,其文件结构树形图如下:

    Email是根元素,包含了From, Date, To, Body, Attachment等子元素。通常根元素的命名被用来代表文件的类型。大家所熟悉的HTML文件,其根元素就被命名为html

    一份Well-formed XML文件应该有如下的型式:

<?xml version=1.0 standalone=yes?>

<Email>

   ……

</Email>

 

 

 

1.3.撰写XML文件实例:

    根据文件的类型订定根元素之后,接着就可以开始标示文件的内容,虽然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>

 

 

 

 

 

 

 

 

1.4.剖析(parseWell-formed XML文件:

    完成文件的标示工作之后,接下来就是检查这份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 的浏览结果

2.撰写Valid XML文件的步骤:

2.1.撰写XML宣告(XML declaration):

    Valid XML文件所参照的DTD可以放在文件内部,也可以是另一份外部文件。DTD如果放在文件内部,所使用的XML宣告如下:

        <?xml version=1.0 standalone=yes?>

DTD如果是另一份外部文件,则所使用的XML宣告如下:

        <?xml version=1.0 standalone=no?>

2.2.设计DTD

    采用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至少有一个,BodyAttachment则可以没有或有一个以上。

> 

宣告的结束符号。

 

    元素的内容模式(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文件,下面是一份引用外部DTDValid 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>

 












以下则是一份引用内部DTDValid 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>

 




















(二)
   
剖析(parseValid 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进行文件结构的确认。

3.XML编辑器:

    利用最简单的文字编辑器(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来进行文件结构的确认。


第三章 XMLHTML在特性上的不同:

大部分的人都听过HTML,透过XMLHTML的比较来原本就熟悉HTML的人来说,是学习XML的好方法。XMLHTML是不同层级的标示技术,HTML是一种特定的标示语言,包含了一组标准的元素集(element set),元素用来指示特定的文字片段在文件中所扮演的角色,每一个元素都有标准的意义。例如:<H1></H1>HTML文件中的意义是最重要的标题(heading)。除了HTML之外,还有很多种特定的标示语言,例如航空产业针对飞行器维护手册制定了一个标示语言称为ATA-2100,半导体产业针对电路数据制定了一个标示语言称为PCIS,计算机产业针对软件文件订了一个标示语言称为DocBook。这些特定的标示语言都有以下共同点:

●都定义了一组标签集(tag set),每个标签都有标准的意义及标准的使用规则,也就是有标准的文法(grammer)。

●都是为了某类型的文件或数据专门设计的。

●都使用文字处理(text processing)国际标准SGML来定义它们的标签集与文法。

XML继承了SGML的可扩展性(extensibility)、结构性(structure)与可确认性(validation),这三点也是XMLHTML在特性上最重要的不同,说明如下:

          

HTML

XML

可扩展性(extensibility)

卷标集与每个卷标的意义是固定的,使用者无法自行定义卷标(tags)或属性(attribute)。

允许使用者根据需要,自行定义卷标与属性,以便更进一步描述数据的语意。

结构性(structure)

不支持深层的结构描述。

能描述各种复杂的文件结构,如数据库纲要 (schema)及对象导向的阶层结构。

可确认性(validation)

没有提供语法规格来支持应用程序对HTML文件进行结构确认。

可包含一个语法规格 (DTD),让应用程序对文件进行结构确认。

 

1.XMLHTML语法比较:

1.1.XML文件必须遵守阶层的元素结构(hierarchical element structure):

XML文件每一个起始标签都要有对应的结束卷标,成对的起始卷标与结束卷标就称为元素。每一元素都必须巢状包覆(nested within)在另一个元素之内。例如:

<LI>HTML allows <B><I>improper nesting</B></I>

上面是一段HTML原始码,但BI并没有巢状包覆的关系,且LI没有结束标签,所以不符合XML的语法规则。

<LI>XML required <B><I>proper nesting</I></B>

上面这个例子则符合XML的语法规则,I巢状包覆在B之内,且每一个元素都有成对的起始卷标与结束卷标。

1.2.XMLHTML对于空元素(Empty elements)的表示方式不同:

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处理器才不至于搞混。

1.3.XML所有的属性值(attribute value)必须以引号(quotes)夹住:

 HTML除了包含空白的属性值必须以引号夹住外,其余的情况可以省略引号;而XML所有的属性值(attribute value)都必须以引号(quotes)夹住。例如:

<FONT color=#FF0000>HTML attribute value</FONT>

 以上是一段合法的HTML原始码,属性值没有用引号夹住,不符合XML的语法规则。

<FONT color=#FF0000>XML attribute value</FONT>

 上面这个例子符合XML的语法规则,属性值必须用单引号或双引号夹住。

1.4.XML标签大小写有区别(case-sentitive):

HTML卷标大小写是一样的,XML标签大小写则有区别。例如:

<H1>HTML is not case-sensitive, XML is.</h1>

以上是一段合法的HTML原始码,在HTML中,H1h1是相同的标签;但在XML中,H1h1则是不同的标签。上面的HTML原始码若以XML的语法来写,就得写成

<H1>HTML is not case-sensitive, XML is.</H1>

1.5.XMLHTML对空白(white space)的处理方式不同:

 HTML除了PRE元素内的连续空白有效外,其余的连续空白都会被视为只有一个空格符。HTML的空白包括了ASCII space&#x0020)、ASCII tab&#x0009)、ASCII form feed&#x000C)、Zero-width space&#x200B)以及 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)则不同。

1.6.XML文件只能有一个根元素(root element):

这个限制使得XML剖析器较容易确认文件已经结束了。

1.7.XML允许指定不同的字集编码(character set encoding):

    XML的字集编码是在<?xml?>宣告中指定,例如:

<?xml version=1.0 encoding=UTF-8>

上面的例子表示这份XML文件以UTF-8编码。所有符合XML规格的软件工具一定都支持ISO 10646字集,ISO 10646是一组庞大的字集,其中包含了Big5中文码及GB2312中文码中所有的字。ISO 10646包含了几种编码方式:UTF-88 bit的,UTF-1616-bit的,Unicode就是UTF-16的形式。

1.8.XML的特别保留字符(special reserved characters):

有一些字符本身就是XML语法结构的一部份,若要在XML文件中使用这些字符必须使用替代的表示法,XML使用预先定义的实体(predefined entity)来替代这些字符,如下表:

Reserved character

Predefined entity to use instead

< 

&lt;

> 

&gt;

&

&amp;

&quot;

&apos;

 

上表中前四个字符在HTML中也使用同样的替代表示法,在HTML中称为字符实体参引(character entity references)。

2.如何将HTML文件转换成Well-formed XML文件:

 要将现有的HTML文件转换成XML文件,首先要先使文件具备Well-formedness,除了要在文件的开头加上XML宣告外(<?xml version=1.0?>),可以依循下列四个转换步骤。

2.1.将所有的卷标转换成适当的巢状结构:

 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>

2.2.使每个元素都有有起始卷标与结束卷标:

 SGML允许省略标签,只要在DTD中宣告该元素的卷标可以省略即可。在HTML 4.0 DTD中,许多标签都是允许省略的,如元素 p, ul, 的结束卷标,甚至连元素 html, body 的起始与结尾标签都可以省略。要将HTML文件转成XML文件,必须将所有省略的标签都补上。

2.3.将所有的属性值都加上单引号或双引号:

 HTML中,属性值的引号有时会省略,特别是数字型态的属性值,在XML文件中任何型态的属性值都必须加上单引号或双引号。在HTML中,如果属性只有一种可能的值,甚至可能省略属性的名称,直接写入属性值。如 <ul compact>,在XML中必须写成 <ul compact=compact>

2.4.将空元素(empty)转换成XML的格式:

    XML对于空元素的表示有特别的格式,如下面是一段HTML原始码:

        <IMG ALIGN=RIGHT SRC=sample.gif>

  XML中必须表示如下:

        <IMG ALIGN=RIGHT SRC=sample.gif/>

第四章 XML参考资源

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/