XML 文件中的元素包含了真正的文件信息(例如,在列表3-1 中,有存货清单中书籍的标题、作者、价格,与其它信息),而且指出了这些信息的逻辑结构。
元素会以树状结构的方式被安排,元素可以巢状套迭在其它的元素之中。文件必须明确地拥有一个顶层元素-文件元素或根元素-而其它的元素都套迭在这个元素之下。因此,下面是一个格式正确的XML 文件。
<?xml version="1.0" ?>
<!--A well-formed XML document.-->
<INVENTORY>
<BOOK>
<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>
然而,下面的文件则不是格式正确的:
<?xml version="1.0"?>
<!--This document is NOT well-formed.-->
<BOOK>
<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>
元素必须适当地套迭。这代表,如果元素(由一组起始卷标与结束卷标来界定,作者稍后将会介绍。)是在另一个元素之中开始,它必须也在相同的元素之中结束。例如,这些元素都是格式正确的:
<BOOK>
<TITLE>Leaves of Grass</TITLE>
<AUTHOR>Walt Whitman</AUTHOR>
</BOOK>
然而,这些元素就不是格式正确的:
<!--NOT well-formed:-->
<BOOK><TITLE>Leaves of Grass</BOOK></TITLE>
注意
一个包含一个或多个套迭元素(如列表3-1 中的BOOK)的元素称为父元素(parent element)。而一个直接包含在父元素之下(如BOOK 之下的TITLE)的元素则称为子元素(child element)、副元素(subelement),或父元素的套迭元素。
元素解析
如你所见,元素通常由起始卷标、内容与结束卷标所组成。
不像HTML,XML 要求你一定要包含起始卷标与结束卷标。(唯一的例外是没有内容的元素,你可以使用稍后介绍的特殊空元素。)
出现在起始卷标与结束卷标开头部份的名称(在上面的例子是TITLE),称为元素的型态(type)或通用识别代号(generic identifier:GI)。型态名称可以用来识别特殊的元素型态或元素类别,而不是特定一个元素。因此,元素可以包含多个拥有相同型态名称的元素(如列表3-1 中的BOOK 或TITLE 元素)。
当你为XML 文件加入元素时,你可以选择任何你想要的型态名称,只要遵守下面的规则即可:
名字必须以字母或底线开头(_),后面接着零或多个字母、数字、句号(.)、连字号(-),或底线(_)。
XML 规格书中说明了元素的型态名称是以「xml」(以任何大写或小写字母组成)为前缀,而且将被保留成为标准规格。虽然Internet Explorer 5 并不强迫要求遵守这项限制,但最好不要使用这个前缀以避免将来产生问题。
下列是合法的元素型态名称:
Part
_1stPlace
A
B-SECTION
Street.Address.1
下列则是不合法的元素型态名称:
1stPlace <!──Digit not allowed as first character ──>
B Section <!──Space not allowed within a name ──>
B/Section <!──Slash not allowed within a name ──>
:Chapter <!──Colon not allowed as first character in IE5 ──>
A:Section <!──In IE5,allowed only if you 've declared A
as a namespace ──>
注意
根据XML 规格书中的定义,元素名称中的冒号(:)将被保留作为命名空间(namespace)用。命名空间负责区别拥有相同名称的元素,笔者将在第七章的 <将HTML 元素加到XML 文件中并使用命名空间> 中继续讨论。只有当元素名称接在已经宣告过的命名空间之后,Internet
Explorer 5 才会让你在元素名称中加入冒号。例如,A:Section 只有在你已将A 宣告成命名空间时才为合法。
同时,起始标签中的名字必须完全与结束标签中的名字相同,包括字母的大小写。因此,底下的元素就不是格式正确的:
<Title>Chapter One</title><!──NOT well-formed.──>
元素名字中的大小写相当重要,如同所有卷标中的文字规定一样,有大小写之分。因此,元素型态名称Ace 与ace 或ACE 并不相同。
如同你所看到的,属性规格是由属性名称后面接着等号,再接着属性值所构成的。你可以选择你想要的任何名称,只要遵循下面规则即可:
名称必须由字母或底线所组成(_),后面接着零或多个字母、数字、句点(.)、连字号(-),或底线(_)。
XML 规格书中陈述了属性的名称以「xml」(任何大写或小写字母的组合)作为起始,该前缀被「保留作为标准规格」。虽然Internet Explorer 5 并未执行这项限制,但最好还是不要使用该前缀以避免将来的冲突。
特定的属性名称只能出现在起始卷标或空白卷标中一次。
例如,下面起始卷标中的属性名称是合法的:
<ANIMATION FileName="Waldo.ani">
<LIST _1stPlace="Sam">
<ENTRY Zip.Code="94941">
下面的属性名称则是违法的:
<!──Duplicated attribute name in same tag:──>
<ANIMATION FileName="Waldo1.ani" FileName="Waldo2.ani">
<LIST 1stPlace="Sam"><!──Digit not allowed as
first character ──>
<ITEM A:Category="cookware"><!──In IE5,allowed only if you 've
declared A as a namespace ──>
注意
根据XML 规格,在属性的名称中冒号的使用被保留供指定命名空间用。命名空间被用来区分拥有相同名字的属性;命名空间将在第七章中的 <将HTML 元素加到XML 文件中并使用命名空间> 作讨论。只有当元素名称接在已经于文件中宣告过的命名空间之后,Internet Explorer 5 才会让你在元素名称中加入冒号。例如,只有当你已经将A 宣告成命名空间时,A:Category 才是合法的。
合法属性值的规则
你指定到属性的值是包含在引号内的一连串字符,称为引号字符串(quoted string),或literal。你可以指定任何的literal 值到属性中,只要遵守下面的规则即可: 字符串可以使用单引号(')或双引号(")来包围。 字符串中不能包含用来包围字符串的引号。 字符串可以包含字符参照或普通内部实体参照。(第六章中将讨论字符参照与实体参照) 字符串不能包含(<)字符。(解析器会把该字符与XML 卷标的起始符号混淆) 字符串不能包含(&)字符,除了作为字符参照或实体参照的起始外。
你已经看过合法属性规格的范例。下面的属性规格则是违法的:
<EMPLOYEE Status=""downsized""><!--Can 't use delimiting quote
within string.-->
<ALBUM Type="<CD>"><!--Can 't use <within string.-->
<WEATHER Forecast="Cold &Windy"><!--Can 't use &except to
start a reference.-->
如果你想要在属性值中包含双引号("),你可以使用单引号(')来包围界定字符串,如下面范例所示:
<EMPLOYEE Status='"downsized"'><!--Legal attribute value.-->
同样地,要将单引号(')包含在字符串中,就使用双引号(")来将字符串包围:
<CANDIDATE name="W.T.'Bill ' Bagley""><!--Legal attribute value.-->
提示
你可以借着使用字符参照来避开这种字符限制并输入任何字符到属性中,或是使用-如果可以的话-预先定义的普通实体参照。笔者将在第六章中解释字符参照与预先定义的普通实体参照。
如果你建立一个不包含文件型态宣告的格式正确的文件(如你在本章中所作的),你可以赋予属性符合上述规则的任何值。然而,如同你将在第五章中学到的,当你建立文件型态宣告并将属性定义于该宣告内,你可以限制那些可以被指定到属性的值的型态。例如,你可以将属性定义成其值只能接受「yes」或「no」。因此,将某些型态的信息储存到元素的属性中而非内容中的好处,就是你可以获得更多可以被指定到属性上的数据型态上的控制权,并让解析器实行这些型态的限制(如同你将在第五章中看到的,基本的XML 规格并不提供方法来限制元素中字符数据的型态)。