在本章中,你将学习如何加入三种XML 标签到文件中:批注、处理指令,与CDATA 区段。虽然这些项目在格式正确(或有效)的XML 文件中并不是必要的,但是它们拥有极大用处。你可以使用批注来让文件更具可读性,也可以使用处理指令来修改应用软件处理或显示文件的方法。同时你也可以使用CDATA 区段来将字符的任何组合包含在元素的字符数据中。
加入批注
如同你在第一章中学到的,XML 规格的第6 个目标就是「XML 文件应该是易读的且合理清楚的」。虽然XML 处理器通常会忽略批注,但是适当放置且具意义的批注可以大大增进XML 文件的可读性与清楚度,就像批注可以让程序的原始码如C 或BASIC 变得更容易了解。
注意
在Microsoft Internet Explorer 5 中,XML 处理器并不会将批注的文字解析成XML 卷标,也不会以任何其它方式来处理批注。然而,处理器让批注的文字可以被HTML 网页中的script 使用。在第九章中,你将学习如何使用script 来存取批注文字,就像使用XML 文件中其它的组件一样。
如果你将文件于浏览器中直接开启,而且文件并没有参照的样式表,则Internet Explorer 5 会将所有的批注显示于XML 文件中。
批注的型式
批注以<!--字符起始,并以-->字符结束。在这两个定义符号之间,你可以输入任何想要的文字-除了双连符号(--)之外。你甚至可以输入被禁止的(<)与(&)符号。下面是一段合法批注的范例:
<!--Here you can type any text except a double hyphen. The <and &characters are OK!-->
你可以放置批注的位置
你可以将批注放在XML 文件中标签之外的任何地方。换言之,你可以将它们放在文件的序文中:
<?xml version="1.0"?>
<!--Here is a comment in the prolog.-->
<DOCELEMENT>
This is a very simple XML document.
</DOCELEMENT>
你可以将批注接在文件的元素之后:
<?xml version="1.0"?>
<DOCELEMENT>
This is a very simple XML document.
</DOCELEMENT>
<!--This comment follows the document element.-->
而你也可以将批注放在文件的内容中:
<?xml version="1.0"?>
<DOCELEMENT>
<!--This comment is part of the content of the root element.-->
This is a very simple XML document.
</DOCELEMENT>
下面是一个违法的批注范例,因为批注被放在标签中:
<?xml version="1.0"?>
<DOCELEMENT <!--This is an ILLEGAL comment!-->>
This is a very simple XML document.
</DOCELEMENT>
然而,你可以将批注放在文件型态宣告(DTD)中-虽然DTD 也是标签的一种-但只要批注不是位在DTD 里其它的标签中即可。你将在第五章学习DTD 的相关知识与如何将批注放在DTD中。
使用处理指令
处理指令的目的是提供XML 处理器传送给应用软件的信息。
注意
回想第二章所介绍的,XML 处理器是一个读取与储存XML 文件内容的软件模块。应用软件是一个个别的软件模块,负责从处理器取得文件的内容并管理与显示这些内容。当你在Internet Explorer 5 中显示XML 时,浏览器会提供XML 处理器与少部分的应用软件。(如果你撰写script来管理与显示XML 文件,你必须自己提供部分的应用软件)
处理指令的类型
处理指令拥有下列一般类型:
<?target instruction ?>
这里的target 是该指令被导引到的应用软件的名字。任何的名称都可以,只要遵守下列规则即可:
名字必须以字母或底线(_)开始,后面接着零或多个字母、数字、句点(.)、连字号(-),或底线(_)。
名称「xml」,不管是大写字母或小写字母组成的都会被保留。(如同你所见到的,你使用「xml」以小写字母来代表文件的XML 宣告,这也是处理指令的一种。)
而instruction 则是被传送到应用软件的信息。它是由任何连续的字符组成,除了「?>」字符对以外(它被保留作终止处理指令用)。
如何使用处理指令
你可以在XML 文件中使用的特殊处理指令是根据读取文件的处理器而定。如果你使用Internet Explorer 5 当作XML 处理器(如同本书中普遍使用的),你将发现处理器的两个主要用途:
你可以使用标准的、保留的处理指令来告诉Internet Explorer 5 如何处理或显示文件。你在本书中见到的范例是处理指令告诉Internet Explorer 5 去使用特定样式表来显示文件。例如,下面的处理指令告诉Internet Explorer 5 使用Inventory01.css 的CSS 来显示文件:
<?xml-stylesheet type="text/css" href="Inventory01.css"?>
如果你撰写网页的script 来处理与显示XML 文件,你可以将任何非保留的处理指令加入到文件中,而且你的script 会读取这些指令并做出适当的处理。例如,你可能会将下面的处理指令加到文件中来告诉你的script 要显示的详细程度:
<?MyScript detail="2" ?>
在第九章中,你将学习如何使用script 来存取XML 文件中的组件,包括任何的处理指令。
||||||你可以放置处理指令的地方
你可以将处理指令加到XML 文件中标签以外的任何地方-意即,你可以将指令放在与放置批注相同的地方:在文件的序文中,后面接着文件元素,或者就放在元素的内容中。下面是一份处理指令位在每一个合法位置的XML 文件:
<?xml version="1.0"?>
<!--The following is a processing instruction in the prolog:-->
<?xml-stylesheet type="text/css" href="Inventory01.css"?>
<INVENTORY>
<BOOK>
<!--Here 's a processing instruction within an
element 's content:-->
<?ScriptA emphasize="yes" ?>
<TITLE>The Adventures of Huckleberry Finn</TITLE>
<AUTHOR>Mark Twain</AUTHOR>
<BINDING>mass market paperback</BINDING>
<PAGES>298</PAGES>
<PRICE>$5.49</PRICE>
</BOOK>
<BOOK>
<TITLE>Leaves of Grass</TITLE>
<AUTHOR>Walt Whitman</AUTHOR>
<BINDING>hardcover</BINDING>
<PAGES>462</PAGES>
<PRICE>$7.75</PRICE>
</BOOK>
</INVENTORY>
<!--And here 's one following the document element:-->
<?ScriptA Category="books" Style="formal" ?>
下面则是一个放在卷标中的违法处理指令的范例:
<!--The following element contains an ILLEGAL
processing instruction:-->
<BOOK <?ScriptA emphasize="yes" ??>>
<TITLE>Leaves of Grass</TITLE>
<AUTHOR>Walt Whitman</AUTHOR>
<BINDING>hardcover</BINDING>
<PAGES>462</PAGES>
<PRICE>$7.75</PRICE>
</BOOK>
然而,你可以将处理指令放在文件型态定义(DTD)中-虽然DTD 也是一种卷标-但是只要处理指令不是放在同样位在DTD 中的其它标签之中即可。你将在第五章中学习有关DTD 的知识,以及如何将处理指令放在DTD 中。
包含CDATA 区段
如同你在第三章中学到的,你不能直接将(<)或(&)符号放置在元素内容中的字符数据里。要避开这个限制的一种方法是使用字符参照(& #60;或& #38;)或预先定义的普通实体参照(& lt;或& amp;),如同你在第六章中将学到的。然而,如果你需要加入多个(<)或(&)字符,使用这些参照将变得不合适且会让资料变得难以阅读。在这种情况下,将包含限制字符的文字放置在CDATA 区段中将会比较容易完成工作。
CDATA 区段的类型
CDATA 区段以字符「<![CDATA[」开始,并以「]]>」字符结束。在这两个定义符号之间,你可以输入任何字符(包括「<」或「&」),除了「]]>」之外。(因为,该字符会被解释成CDATA区段的结束。)所有位在CDATA 区段中的字符都被视为元素字符数据的字义 (literal) 部分,而不是XML 标签。
下面是一个合法CDATA 区段的范例:
<![CDATA [
Here you can type any characters except two right brackets followed
by a greater-than symbol.
]]>
注意
关键词CDATA,就像其它你所见到的XML 关键词,必须以大写字母撰写。
如果你想包含一段原始码或标签当作被显示在浏览器中元素的真实字符数据的一部份,你可以使用CDATA 区段来防止XML 解析器将「<」或「&」字符解释成XML 卷标。下面就是一个范例:
<A-SECTION>
The following is an example of a very simple HTML page:
<![CDATA[
<HTML>
<HEAD>
<TITLE>R.Jones &Sons</TITLE>
</HEAD>
<BODY>
<P>Welcome to our home page!</P>
</BODY>
</HTML>
]]>
</A-SECTION>
例如,若没有CDATA 区段,处理器会假设<HTML>是套迭的元素的起始部分,而不是A-SECTION 元素的字符数据的起始部分。
注意
既然你可以直接将「<」与「&」字符加入CDATA 区段中,你就不必使用字符参照(& #60;与&)或预先定义的普通实体参照(& lt;与& amp;),笔者将在第六章中解释字符参照与实体参照。事实上,如果你使用这类的参照,解析器会将参照中的每个字符照字面解释,且不会更换掉含有「<」或「&」字符的参照。
你可以放置CDATA 区段的地方
你可以将CDATA 区段放置在字符数据可以出现的任何地方-也就是说,在元素的内容中却不在XML 标签中。下面是一个合法放置CDATA 区段的范例
<?xml version="1.0"?>
<MUSICAL>
<TITLE_PAGE>
<![CDATA[
<Oklahoma!>
By
Rogers &Hammerstein
]]>
</TITLE_PAGE>
<!--Other elements here...-->
</MUSICAL>
显示于下页的错误型式XML 文件包含了两个违法的CDATA 区段。第一个不是在元素的内容中。第二个则是位在文件元素的内容之中,但却不是在起始标签中。
<?xml version="1.0"?>
<![CDATA[ ILLEGAL::not within element content!]]>
<DOC_ELEMENT>
<SUB_ELEMENT <![CDATA[ ILLEGAL::inside of markup!]]>>
sub-element content...
</SUB_ELEMENT>
</DOC_ELEMENT>
注意
CDATA 区段不能成巢状套迭。亦即,你不能将一个CDATA 区段放到另一个区段中。