2.5 字符数据

开始标签和结束标签之间的文本可以是任何Unicode字符,并且其间的任何字符都将忠实地传递给XML处理程序。例如下面的代码:

程序清单:codes\02\2.5\blank.xml

alt

在上面的文档中,两个<计算机书籍…/>元素并不相同。后一个元素的文本字符串相比于前一个元素多了许多内容(空白和回车)。

HTML会把多个连续的空格字符裁减为一个,但XML则会忠实地保留所有空白。假设有如下HTML元素:

alt

实际输出时将变为如下形式:

alt

但XML文档中的所有空格都会被忠实地传给处理程序,因此XML元素里的空格不会被删除。

如果文本字符串中包含一些特殊的字符,例如尖括号(<)或and符号(&),由于这些符号在XML文档中都有特殊的含义,因此直接在XML元素中使用该字符串将引起文档混乱。看下面的文档:

程序清单:codes\02\2.5\ltSignal.xml

alt

上述文档中的<比较符…/>元素的内容需要出现1+1<3字符串。但该元素的内容完全不行,图2.9所示是该文档在浏览器中浏览的结果。

alt

图2.9 文本字符串中包含特殊字符

有两种方法可以解决这个问题:

alt 使用实体引用:用另一个特殊标记来代替这些特殊符号。

alt 使用CDATA标记:将整段文档定义成字符串。

2.5.1 使用实体引用

为了正确处理XML文档中的特殊字符,XML允许使用实体来表示这些特殊字符。XML预置了5个实体引用,如表2.1所示。

表2.1 XML预置的实体引用

alt

因此,上面的文档改成如下形式即可正确显示:

程序清单:codes\02\2.5\entityRef.xml

alt

上述文档的浏览结果如图2.10所示。

alt

图2.10 实体引用的效果


alt注意

使用实体引用的格式相当固定:总是以“&”开始,以“;”结束。不要忘记实体引用后面的英文分号。


需要指出的是,在XML中其实只有字符<和&确实是非法的,而大于符号(>)其实是合法的,不过通常还是推荐使用实体引用来代替它,这样可以保证更好的可读性。

实体引用简单易用,但需要记熟。如果字符串中包含大量特殊字符,则需要使用实体引用逐一替换,这相当麻烦,幸好还有另一种解决方案——使用CDATA标记。

2.5.2 使用CDATA标记

在特殊标记CDATA下,所有的特殊字符,甚至是有效的元素都将被当成简单字符处理。实体引用也会失去作用,变成直接文本。CDATA的语法格式如下:

alt

因此,可以将上面的文档变成如下形式:

程序清单:codes\02\2.5\cdata1.xml

alt

当XML文档解析器处理该文档时,<比较符…/>元素的值将是1+1<3。

甚至对于如下特殊的形式:

程序清单:codes\02\2.5\cdata2.xml

alt

上面的<书籍列表…/>元素将没有任何子元素,而只有一个简单的文本字符串,只不过该文本字符串内容较多而已。该文档的执行结果如图2.11所示。

alt

图2.11 CDATA标记的效果

<书籍列表…/>内的所有内容都处于CDATA标记内,因此这些内容将全部被当成字符串处理,即使它们包含了合法的元素。


alt提示

由于XML根本不会对CDATA标记内的内容进行任何解析,因此在CDATA内可放置任何内容,其中的内容永远不会出错。