1.4.1
? XML和HTML同属一个大家族——标记语言家族。 ? HTML(HyperText Markup Language),超文本标记语言是一种标记语言。 ? HTML的精髓在于“标记”,然而“标记”的含义究竟是什么呢?“标记”的一个精
确定义是:就数据本身的信息对数据进行编码的方法。
比较XML和HTML?
? 相同:XML和HTML都一种标记语言,在形式上相似。
? 不同:HTML定义了一套固定的标签,用来描述一定数目的元素。如果标记语言中
没有所需的标签,用户只好等待标记语言的下一个版本。而XML是一种元标记语言,用户可以定义自己需要的标签。这些标签必须根据某些通用的原理来创建,但是在标记的意义上,具有相当的灵活性。XML定义了一套元句法,基于XML已经创建出很多特定领域有关的标记语言(如MusicML、MathML和CML)。
1.4.2
1、形式应遵循功能 2、文档无二义性 3、标记与显示分离 4、保持简单性
5、进行最大化的错误检测 6、适应各种语言
1.4.3
格式化策略:1、CSS(Cascading Style Sheet,层叠式样式表)
? XML文档的格式化策略有几种,其中最简单易行的就是CSS。
? CSS文件通常是和XML文档独立存在的,其包含了每个元素名字到显示细节(字体、
颜色、边距等)的映射。Web浏览器可以看作是一个格式化XML文档的处理器,它将XML文档和CSS样式文件读入,然后根据CSS样式表中的样式映射对XML文档的每个元素进行格式化,并最终形成一个格式化网页文件。
? CSS样式表仅适合那些格式化输出顺序与XML文档内部数据输入顺序相一致的应用
中。如果用户想有选择的格式化显示XML文档中的某些数据或不按XML文档中数据的输入顺序进行格式化输出时,采用CSS样式表这种方式是不合适的。
格式化策略:2、XSLT(Extensible Stylesheet Language Transformations,扩展样式表转换语言)
? 比CSS样式表更加有效的技术是对XML文档进行变换,即将XML文档进行拆分,然
后组合成一个新的文档。
? 对XML文档进行转换的技术中最典型的就是XSLT,它是专门为了转化XML文档而
设计一种编程语言。
? 最普遍的转换方法是将一个没有显示格式的XML数据文件转变为由数据和显示信息
混合的格式。这个新格式会丢弃语义信息,以便更好的适应设备特性和进行高效的显示信息描述。
? 一旦XML文档被转化为新格式文档,由于丢弃了语义信息,就很难从新格式文档转
换回到原始数据格式。虽然逆向转换存在问题,但是进行显示格式化的主要目的是提供一种优雅的适合显示和打印页面格式,这就足够了。
1.4.4
首先,每种XML分析程序都要求XML文档中标签的语法错误,例如,标签缺失、标签异常、非法字符以及其他语法问题都要求立即报告给用户。
通过了此XML分析程序的语法检测,这样的XML文档被称为:形式良好的XML文档。 其次,要保证XML文档对于某个应用领域的用户是有效的。
对于这方面的问题,需要对XML文档的有效性进行测试,完成这个工作的工具称为:有效性分析程序。
2.7.1
? 文档(document):是由元素和其他一些标记按照一定的次序构成的,它是XML信
息的一个基础单位。
? XML文档可以包含一段文本,如一个故事或一篇文章,但这不是XML文档仅能包含
的。XML文档更多的是象数据库一样保存数据信息,或保存一些为显示化学分子式或数学公式而设计的抽象结构信息等。
? XML最吸引人的应用是在应用程序之间进行各种不同类型数据的格式转换。
2.7.2
? XML声明中的三个属性的名称分别是:version、encoding和standalone。 version属性
? 用来声明XML文档所遵循的XML标准的版本。现在,通常情况下该属性的值都是
1.0,尽管XML 1.1已经成为W3C的推荐标准,但是大部分XML分析器还是采用的是XML 1.0的标准。version是XML声明中必须包含的一个属性。
encoding属性
? 用来告知XML分析程序,当前XML文档使用什么样的字符编码。该属性是可选的,
当XML声明中没有明确给出字符编码方式时,XML分析程序将默认认为XML文档采用的是UTF-8字符编码。 ? 常用encoding属性值:
encoding指定编码与XML文本物理保存编码
? 通过encoding进行XML文档的字符编码配置后,并不能确保XML分析程序就能正
确的处理XML文档,还必须保证XML文档保存到磁盘时采用了合适的编码方式。 ? 例如,某用户通过Windows系统的自带文本编辑器Notepad编写包含中文字符的
XML文档时,使用XML文档默认字符编码方式UTF-8,随后采用Notepad的默认编码方式ANSI保存XML文档到磁盘。然而当该用户使用IE浏览器打开先前保存在磁盘上的那个XML文件时,会发现IE浏览器提示有非法字符存在。出现这个问题的根本原因在于,UTF-8和ANSI两种字符编码在表示中文字符时的不同所导致的。所以在为XML文档选择了特定字符编码的同时,也要确保选择了正确的编码方式来保存XML文档。
standalone属性
? XML文档可能:
? 存储在数据库中
? 由CGI程序在内存中瞬间创建的
? 由几个相互嵌套的不同文件组合而成 ? 不存在于自身的文件中
? 但是如果把一个XML文档看作一个文件也是可以的,只要记住它可能并不是存在于
硬盘上的真实文件。
standalone属性值的含义
? 如果由一个实体构成的简单的XML文档,并且文档中只包含文本数据,不包含诸如
图片小程序一类的二进制数据,能够完全独立被理解而无需读取其他文件,那么就说这个XML文档是独立存在的。这种文档通常在它的XML声明中含有一个值为yes的standalone属性设置。
? 如果XML文档不是独立存在的,还需要访问其他外部实体时,在XML文档声明就可
以含有一个值为no的standalone属性设置。
2.7.5
? 首先,标签不是元素,元素也不是标签。元素是由开始标签、结束标签以及包含其
间的一些内容共同构成。标签是标记一个元素的开始或结束的符号标识。
? 空元素语法形式是一个简化版本,其完整的形式为:<标签名属性1 属性2 …>
标签名>。由此可以看出其实空元素就是元素内容为空的一种特例情况。
? 其次,标记不象标签和元素,在XML文档中有具体的形式和对应物。标记不是一个
XML标准中特定的语法对象或概念,它是XML中对各对象的一种统称。总之,在XML文档中标记可以指标签、注释、XML声明、文档类型声明、CDATA段以及命令处理等。 比较对象 形式 作用 标记XML文档不同区域(通常是一个元素的开始或结束)的界限。 英文标签 “<”+标签名+“>”或“<”+标签名+“>” Tag标记 一种对XML对象的统称 在XML文档中标记可以指标签、注释、XML声明、Ma文档类型声明、CDATA段以及命令处理等。 元素 <标签名>+内容+标签名>或<标签名/> 是构成XML文档的基础构件。 Ele
2.7.6
何时使用子元素或属性没有严格的规则可循,通常要看哪一种更适合自己应用的需要。一种经验规则是:如果是数据本身应当存储在元素中;如果是有关数据的信息(元数据,metadata)应当存储在属性中;在不确定时,就把信息放在元素中。
2.7.9
XML的注释
? 以“”结束。介于“”之间的全部数据均被XML处理器忽略,
就像它们根本不存在一样。注释用于提醒自己或临时标注出文档中不完善的部分。
使用注释时必须遵循以下几条规则
? 注释不能出现在XML声明之前,XML声明必须是文档最前面的部分。 ? 注释不能放在标记中
? 注释可以包围和隐藏标记。。
? 两个连字符号(--)除了作为注释起始和结束标记的一部分外,不能出现在该注释中。
3.5.1
? 属性声明有四种不同的缺省设置,该设置指定了属性在文档中出现的方式。 ? 1.必须赋值的属性#REQUIRED
? 使用关键字REQUIRED指定在XML文档中该属性不可省略,必须为这个属性
给出一个属性值。例如:
? 意味着在XML文档中使用“作者”元素时,必须同时指定“联系方式”属
性的值,其值为CDATA类型。
? 2.属性值可有可无的属性#IMPLIED
? 使用IMPLIED关键字表示并不强行要求在XML文档中给该属性赋值,而且也
无须在DTD中为该属性提供缺省值。可以说,这是对属性值有无的最低要求,现实中经常用到。例如:
? 3.固定取值的属性#FIXED
? 还有一种较为特殊的情况,当需要为一个特定的属性提供一个缺省值,并且
规定XML文档的编写者不能更改它。这时候,就应该使用FIXED关键字,同时为该属性提供一个缺省值。例如:
? 4.仅定义缺省值的属性
? 最后,有一种属性,声明时不使用以上任何一种关键字,仅定义该属性的缺
省值。如果XML文档元素中不包含该属性,则分析器将缺省值作为属性值,否则,可以在XML文档中给出新的属性值来覆盖缺省值。例如:
? 属性“人数”的默认值为“1”,你可以在XML文档中根据实际作者人数指
定其他值。
3.5.2
? 实体在XML中充当着宏或别名的角色。其最根本的作用是为一大段文本创建一个别
名,这样,在文件的另一个位置需要引用这段文本时,只需要指向它的别名就可以了。它还意味着一旦需要修改文本内容,只需要在一个地方作改动,就完成了全局的改动。
? 实体分为一般实体和参数实体两种类型,它们都可以定义为内部的也可以用关键字
SYSTEM定义为外部的。实体的定义必须出现在引用之前,而且要注意正确嵌套,不能出现循环引用的情况。在DTD中,这两种类型的实体都得到了广泛的应用。
? 一般实体的定义方式是:
? 或利用SYSTEM定义外部实体:
? 注意:实体名由字母和数字的以及下划线构成,不能使用空格和其他标点符
号字符。
? 请看下面的例子:
3.5.4
? DTD描述XML文档结构的正式规范。DTD缺陷,归纳如下:
? 1)DTD是基于正则表达式的,描述能力有限;
? 2)DTD没有数据类型的支持,在大多数应用环境下能力不足; ? 3)DTD的约束定义能力不足,无法对XML实例文档做出更细致的语义限制; ? 4)DTD的结构不够结构化,重用的代价相对较高;
? 5)DTD并非使用XML作为描述手段,而DTD的构建和访问并没有标准的编
程接口,无法使用标准的编程方式进行DTD维护。
事实上,XML Schema也是XML的一种应用,它是将DTD重新使用XML语言规范来定义。从某种意义上讲,这充分体现了XML自描述性的特点,与DTD相比,XML Schema具有以下优势:
? 一致性
? 与DTD不同, XML Schema不使用EBNF语法,而是直接借助XML本身的特
性,用XML语法来定义文档的模式,使得XML文档及其模式定义实现了从内到外的统一。此外,XML Schema本身是一种XML文档,可以被现有的XML编辑制作工具所编辑、被XML语法分析器所解析、被XML应用系统所利用,既有投资得到了最大程度的保护。
? 扩展性
尽管DTD中定义了一些数据类型,但基本都是针对属性类型定义的,并且类型非常有限。XML Schema不仅支持DTD中的所有原始数据类型(诸如标识和标识引用之类的类型),还支持整数、浮点数、日期、时间、字符串、URL 和其它对数据处理和验证有用的数据类型。除了规范中定义的数据类型以外,还可以利用XML Schema创建自己的数据类型,并且可以基于其它数据类型派生出新的数据类型。具有良好的可扩展性
? 易用性
? XML Schema优于DTD的另一个原因要归结于DOM和SAX(DOM和SAX将
在后面章节中介绍)。作为一种XML API,DOM和SAX只是对XML实例文档有效,对于DTD则无能为力,不可能通过DOM或SAX来判定在DTD中一个元素的属性类型或者某个元素的子元素允许出现的次数。但是,使用XML Schema则不存在这一问题,因为对XML文档结构进行描述的XML Schema是一种“形式良好的”XML文档,用DOM和SAX去访问就和处理就非常容易了。
? 规范性
? 同DTD一样,XML Schema也提供了一套完整的机制以约束XML文档中元素
的使用,但相比之下,后者基于XML语法,更具规范性。XML Schema利用元素的内容和属性来定义XML文档的整体结构,如哪些元素可以出现在文档中、元素间的关系是什么、每个元素有哪些内容和属性、以及元素出现的顺序和次数等等,一目了然。
? 互换性
? 正如每个人都可定义自己的DTD一样,读者也可根据需要设计适合自己应
用的XML Schema,并且可以同其他人交换彼此的XML Schema。利用XML Schema,我们能够书写XML文档,验证文档的合法性。另外,通过映射机制,还可以将不同的XML Schema进行转换,以实现更高层次的数据交换。例如微软的BizTalk Server,对此就有很好的支持。
4.6.1