• 热门标签

当前位置: 主页 > 航空资料 > 计算机 >

时间:2010-08-09 13:05来源:蓝天飞行翻译 作者:admin
曝光台 注意防骗 网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者

规”到底意味着什么。
2.12 格式正规的文档
所有遵守X M L语法规范的数据对象(文档)都是格式正规的X M L文档。这类文档在使用时
可以不使用D T D或模式来描述它们的结构,它们也被称作独立的( s t a n d a l o n e)X M L文档。这些
文档不能够依靠外部的声明,属性值只能是没有经过特殊处理的值或缺省值。
一个格式正规的X M L文档包含一个或多个元素(用起始和结束标记分隔开),它们相互之间
正确地嵌套。其中有一个元素,即文档元素,包含了文档中其他所有元素。所有的元素构成一
个简单的层次树,所以元素和元素之间唯一的直接关系就是父子关系。兄弟关系经常能够通过
X M L应用程序内部的数据结构推断出来,但这些既不直接,也不可靠(因为元素可能被插入到
某个元素和它的一个或多个子元素之间)。文档内容可能包括标记和/或字符数据。
数据对象如果满足下列条件就是格式正规的文档:
• 语法合乎X M L规范。
• 元素构成一个层次树,只有一个根节点。
• 没有对外部实体的引用,除非提供了D T D。
任何X M L解析器如果发现在X M L数据中存在并不是格式正规的结构,就必须向应用程序报
告一个“致命”错误。致命错误不一定导致解析器终止操作—它可以继续处理,试图找出其
他错误,但它不再会以正常的方式向应用程序传递字符数据和/或X M L结构。
之所以采用这类错误处理方式,一是因为X M L简洁的设计风格,二是因为X M L更多的不是
用于显示—因为这不太容易使得X M L数据对象做到格式正规。这种近乎残酷的错误处理会阻
碍类似Internet Explorer和N a v i g a t o r之类臃肿的软件的创造性(它们拥有各类特殊代码来解决如
何处理意义含糊的H T M L)。
对于H T M L / S G M L来说,它们的工具都要比X M L宽容许多。H T M L浏览器通常会显示出
大多数支离破碎的W e b页面,这为H T M L的快速流行做出了巨大贡献。此外,真正的显示
会因浏览器而异。同样,SGML工具即使遇到错误,通常也会尽力继续处理文档。
格式正规的文档的存在使得可以使用X M L数据而不必承担构建和引用外部描述的重任。术
语“格式正规”与正式的数学逻辑有着相似之处—一个命题如果满足语法规则就是格式正规,
而不在于它的正确与否。
44使用XML 高级编程
下载
2.13 解析器
除去指定X M L的语法,W 3 C推荐标准还描述了X M L客户端体系结构(X M L处理器或解析器)
中低层次的一些行为。目前,有两种类型的解析器:
• 非验证的( n o n - v a l i d a t i n g)—解析器仅仅保证数据对象是格式正规的X M L
• 验证的(Va l i d a t i n g)—解析器使用D T D保证格式正规的数据对象的形式和内容的有效性。
一些解析器同时支持两种类型,其中有判定数据对象是否是需要验证的文档的配置开关。
X M L解析器的一些行为在定义时是为了减少应用程序处理X M L数据的负担。例如,正如我
们在前面描述的那样,用来界定文本记录结束位置的字符序列通常是因操作系统而异的。但是
一个X M L应用程序不必关心这个,因为X M L解析器会把所有标准的文本记录分隔符格式化为一
个换行符(十六进制值0 A)。空白的处理是解析器严格要求的另一个领域—与H T M L或S G M L
不同,所有的空白都必须从文档传递给应用程序。而且,正如外部或内部D T D子集所描述的那
样,普通的(字符)实体会通过解析器加以扩充。
X M L解析器在把属性值(即下面的A t t Va l u e)传递给X M L应用程序之前需要对它们格式化。
这意味着解析器将需要处理下面的引用和字符:
• 字符引用—将引用的字符添加到A t t Va l u e当中。
• 实体引用—递归地展开实体的替换文本,添加到A t t Va l u e当中。
• 空白字符—替换任何回车/换行字符对,它们可能是外部解析实体的组成部分,内部解析
实体的字符串实体值,或者是空格字符(十六进制值2 0)代表的任何空白字符,然后在
A t t Va l u e当中添加空格。
• 其他所有字符—将字符添加到A t t Va l u e当中。
接下来, A t t Va l u e会做进一步处理,删除掉前面和/或后面的空格,然后把多个空格序列转
化成单个空格。这个规则的唯一例外就是如果属性值在D T D中被声明为C D ATA,而且使用的是
需验证的解析器(参见第3章关于D T D的描述和明确的声明)。
实现X M L解析器有两种方法。虽然针对它们的争论非常之多,但是每种方法都有它们的优
势。与许多其他现实世界中的问题一样, X M L的处理的需求会有着极大的区别,所以不同的方
法会适合不同的解决方案。
2.13.1 事件驱动的解析器
处理X M L数据的一种方法是使用事件驱动的解析器,其模式对于现代G U I(图形用户界面,
Graphical User Interface)和O S(操作系统, Operating System)的编程者来说实在是再熟悉不
过了。在这种情况下, X M L解析器为每类X M L数据执行到应用程序的回调:元素(及其属性)、
字符数据、处理指令、符号或者注释。这等于是应用程序通过回调来处理X M L数据—X M L解
析器在解析之后并不维护元素的树结构,或者任何数据。事件驱动的办法对系统资源的需求及
其普通,即使对于非常大的文档也是如此;正是得益于这种简单的、对X M L数据结构的低层次
的访问,X M L应用程序在处理数据时具有相当大的灵活性。
在这类解析器中,最早的、也是最为著名的一个一流程序就是James Clark的e x p a t,它用
第2章XML 语法使用45
下载
A N S I - C写成。它还有相应的C + +(e x p a t p p)、P e r l(X M L : : P a r s e r)和P y t h o n(P y e x p a t)包装器。
C l a r k是XML 1.0推荐标准的技术领袖,他还曾经用J a v a编写了另一个解析器x p。
由David Megginson(M i c r o s t a r的A e l f r e d解析器的作者)领导的X M L - D E V邮件列表的成员
 
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:XML高级编程上(19)