空白处理
在XML规范中,空白包括空格、制表符、空行。
空白在XML文档中,主要有两种作用。
第一种,为了使代码格式更加美观,进行的空白。对于代码本身的运行没有什么影响,仅仅是为了代码的美观和规范。——可以舍弃的空白
第二种,分隔作用,例如<!ELEMENT content (#PCDATA)>此种代码中用到的空白符为空格,主要就是为了分隔关键字ELEMENT、定义的元素content标记和元素类型#PCDATA,是有实际意义的。或者是用户想要保留的空白。——不可舍弃的空白
对于XML文档中,任何一个元素标签之间的空白字符一般都是用来是代码更加美观的,如果用户不特殊说明要保留空白,通常都会进行缺省处理,即舍弃元素标签之间的空白符。
XML处理器总是将文档中不是标记的所有字符都传递给应用程序(个人理解,这里所所说的应用程序就是用来处理这些字符的应用程序),一个进行有效性验证的XML处理器会通知应用程序这些字符中的哪一些组成了出现在元素中的空白。
分析:
XML处理器将不是标记的字符传递给应用程序。
进行有效性验证的处理器还会通知应用程序这些字符中哪些组成了出现在元素中的空白。
通常情况下,当XML处理器将XML文档中的所有不是标记的字符都传递给应用程序之后。应用程序会对空白符做缺省处理,即舍弃空白字符。那么用户如何通知应用程序来保留用户想要保留的空白符呢?看下面的内容:
在XML文档中,可以在元素中使用一个特殊的属性xml:space,来通知应用程序保留此元素中的空白。
注意:该属性名及其功能都已经定义好了,我们使用的时候只要生命即可。
在有效的文档中,这个属性和其它任何属性一样,在使用时必须声明,xml:space属性必须被声明为Eumerated(枚举类型),它的值必须是default和preserve两者之一,也可以两者都取。
看声明语法:
有关元素属性的声明语句,这里只做简单的讲解
首先以"<!“开始,即以小于号<、感叹号!开始
然后以”>"结束,即以大于号>结束
然后里面分为五个部分
第一部分:ATTLIST关键字,为声明属性的关键字。声明任何属性都要用到该关键字。即<!ATTLIST…>为声明属性的固定写法。
ATTLIST个人理解是由attribute+list的英文组合。attribute的英文是属性的意思,list是列表的意思。组合在一起表示属性列表。
第二部分为想要添加属性的标记。我们在使用HTML的时候,都知道各个标记都是由属性的,所以可以说属性是属于某个标记的。所以第二部分为想要添加属性的元素。
第三部分为属性的名称,对于本例来说属性的名称就是xml:space
第四部分为属性取值的类型,也称属性类型。我们这里使用的是枚举类型。枚举类型的含义为该类型的内容是由固定数量的,例如对于月份来说,只有十二个月份。所以也就只能有12种取值。我们这里,取值仅为default和preserve。在定义枚举类型的时候,首先是一对小括号"()",在小括号内部是该枚举类型可以取的值,每个取值用竖线"|"隔开。例如(取值1 | 取值2 …),竖线的含义是“或者”的意思,对于本例
(default | preserve)意思为该枚举类型变量可以取的值为default或者preserve,如果写成(default)表示该枚举类型只有一个取值,即default。
在这里,还需要强调这些枚举类型的取值可以是任意的合法的字符串,在枚举类型括号内部的取值可以省略引号“”。在这里我们使用的xml:space应该是定义好的属性名,其取值default和preserve也是已经定义好的。只是在声明的时候可以取两个取值或者取二者中的任意一个。 即在声明属性类型时可写为:(default | preserve)、(default)、(preserve)
第五部分为缺省值,缺省值的作用是规定在元素中该属性是否必须出现,如果不出现要如何处理。我们只分析上述的语句中使用的缺省值的含义。
<!ATTLIST poem xml:space (default|preserve) 'preserve'>、该语句中,缺省值的意思为当在元素中不写改属性的时候,系统默认添加,
xml:space = “preserve”。
该语句中,缺省值要求如果在元素中不写该属性,那么系统自动添加即
xml:space = “preserve”。注意,跟上一条语句的区别在于#FIXED关键字,fixed、英文为固定的意思。
固定语法格式为#FIXED + 缺省值。#FIXED的作用为该属性的取值只能为某个值。所以#FIXED + “preserve”的含义为:要么不写由系统添加,如果写就必须写成xml:space = “preserve”,即取值只能是preserve。
#FIXED "preserve"和“preserve”虽然都是缺省值,但是前者要求只能写preserve,而后者是如果不写系统默认写成xml:space:preserve,但是如果用户写成了其他值也不会报语法错误,只是没有效果。
<!ATTLIST poem xml:space (default) #FIXED 'default'>该语句含义同上,只是将preserve替换成了default。关于属性声明将有详细的篇幅进行记录。在这里简单总结下属性声明语法为:<!ATTLIST 元素名称 属性名称 属性类型 缺省值>
最后,我们再看xml:space的属性值default和preserve分别是什么含义:
default:表示对此元素使用应用程序的缺省空白处理模式,即去掉空白符。
preserve:要求应用程序保留所有空白。
特别注意:
如果一个元素使用了xml:space属性,将适用于该元素中的所有元素,除非被另一个xml:space属性实例所覆盖。简单理解被含有xml:space属性的元素包裹,该元素即被该元素包裹的所有元素都具有该属性值。如果想要修改,就对想要修改的元素添加xml:space属性。