Uche Ogbuji, 首席顾问, Fourthought Inc.
2006 年 4 月 20 日
在这篇文章中,我将详细讨论一下 Firefox 中的基本 XML 处理。这里提供的 Firefox 屏幕图是使用 Ubuntu Linux 上的 Firefox 1.5.0.1 生成的,配置文件没有修改过(即没有扩展,保持了安装时的默认选项)。
用 Firefox 和 XML 所做的最基本的操作是按照未知的词汇表装载 XML 文件,没有相关联的样式表。清单 1 就是这样一个文件。
清单 1(listing1.xml). 简单 XML 文件示例
|
用 Firefox 查看这个文件会产生 图 1 所示的显示。
仔细看看浏览器区域顶部的消息,即 “The document tree is shown below.”。这说明不应该把它看成 XML 的源代码视图。它只是 Firefox 认识到的文档部分的逻辑布局。它可能会忽略对您有意义但是对 Firefox 没有意义的一些细节,而且会在某些地方歪曲文档。作为歪曲的一个示例,注意 Firefox 让每个元素占一个新行,即使在源代码文档中并不是这样的。对于使用混合内容的文档,这会显著改变内容的布局。作为 Firefox 忽略细节的示例,请在浏览器中查看 清单 2。
清单 2(listing2.xml). 具有名称空间等的简单 XML 文件示例
|
清单 2的显示与 清单 1 的显示完全一样,所以显示中忽略了 XML 声明、文档类型声明和名称空间声明。如果想看到原样的 XML 文档,那么应该使用 view-source 功能。在菜单条上,选择 View,然后选择 Page Source。常用的快捷键是 Ctrl+U。还可以使用右击主浏览器区域所显示的上下文菜单。view-source 显示见 图 2,其内容与源代码清单完全一致。
图 2. 清单 2 在 Firefox 中的 view-source 显示
再看一下 图 1,注意 memo
元素的开始标记旁边的减号。每个容器元素都有这样的标志,可以点击它将这个元素折叠起来。这在调试时很有用,如果对 XML 文件的某些部分不感兴趣,就可以将它们折叠起来。
为了演示 Firefox 对非良构文档的处理,我在 清单 2 中 date
元素的前面添加一个伪造的字符实体 
(一些字符即使表示为实体,在 XML 中也是非法的),然后在 Firefox 中查看它。图 3 显示 Firefox 输出,这里报告了错误以及探测到这个错误的位置。
注意,这里显示了源代码文件的一部分,足以帮助您确定错误的位置。而且,仍然可以使用 view-source 特性来查看完整的源代码文档。
XML 只是一种基本格式,可以用它构建更特定的格式,Firefox 对它支持的特殊 XML 格式进行特殊的处理和显示。我在前一篇文章中涉及了其中一些格式,包括 XHTML、Scalable Vector Graphics(SVG)和 XSLT。对于判断浏览的源代码是一般的 XML,还是 XML 的某种特殊形式,Firefox 采用的主要方法是互联网媒体类型(常常称为 MIME 类型)。对于提交给浏览器的每个资源,Web 服务器会发送 MIME 类型信息。对于在本地文件系统上打开的文件,浏览器根据文件的扩展名来猜测 MIME 类型。表 1 总结了未修改过的 Firefox 安装可以识别的与 XML 相关的 MIME 类型。
MIME 类型 | Firefox 进行的处理 | 注意 |
---|---|---|
text/xml | 如果有 CSS,就应用 CSS,否则使用默认的 XML 处理器 | 尽可能避免使用这个媒体类型 |
application/xml | 如果有 CSS,就应用 CSS,否则使用默认的 XML 处理器 | |
application/*+xml | 如果有 CSS,就应用 CSS,否则使用默认的 XML 处理器 | 使用 XML 约定应用于任何媒体类型 |
application/xhtml+xml | 根据 doctype 声明,显示为 XHTML | 这包括 Firefox 认识到的 XHTML 中嵌入的词汇表,比如 MathML、XLink 和 SVG |
application/vnd.mozilla.xul+xml | Mozilla chrome 处理器(用于定制的 Mozilla UI) | |
application/rdf+xml | 默认的 RDF 显示器(显示所有文本字面对象) | Firefox 在它的配置注册表中使用 RDF |
image/svg+xml | SVG 显示器 |
一些 Firefox 扩展使 Firefox 能够识别其他媒体类型。还可以为某些 XML 格式添加应用程序处理器。例如,如果希望用语音浏览器处理 VoiceXML,可以为 MIME 类型 application/voicexml+xml
注册这个应用程序。
在 Firefox 装载页面时,您可以检查 Firefox 将哪种 MIME 类型与这个页面关联起来。右击页面并从上下文菜单中选择 View page info。Firefox 对于具有 .xml 扩展名的文件使用 text/xml
,尽管按照当前的最佳实践,它应该使用 application/xml
。
Firefox 不支持你可能需要的一些 XML 设施。在为 Firefox 设计页面时,您应该知道它在基本 XML 处理方面的限制。在 bug 报告和改进请求(“bugzilla”)中提到了其中的许多限制。在 参考资料 中可以找到它们的链接。您可以对 bug 或改进请求投票,以便让 Mozilla 开发人员给予这个问题更高的优先级,所以如果这些限制影响了您,就请考虑获得一个 Mozilla bug 跟踪者帐号(很容易获得)并对解决方案投票。
要注意的第一个限制是,当 Firefox 解析 XML 文件时,它会长时间地挂起进行处理的线程,直到完成解析。这意味着,如果向 Firefox 发送一个非常大的 XML 文件,您的用户必须等待很长时间才能看到内容显示。如果向 Firefox 发送一个大型的 HTML 文件,它会采用递增式显示,在读取文件的同时显示 HTML。如果对于 XML 有相同的功能就好了,但是目前没有,所以应该考虑控制发送给浏览器的 XML 文件的大小。
Firefox 不支持 DTD 检验。它不读取外部文件中的 DTD,也不使用文档中的任何声明(称为内部子集)来进行检验。在读取外部文件时,Firefox 根本不读取任何外部实体,无论是参数实体(比如 DTD 和 DTD 片段)还是一般实体(外部的良构的 XML 片段)。这意味着,无论 extFile.ent 的内容是什么,Firefox 处理 清单 3 和 清单 4 的方式在逻辑上是相同的。
|
清单 4. 没有实体的 XML,但是 Firefox 在逻辑上按照与清单 3 相同的方式处理它
|
对外部实体的支持可能会导致安全问题,还可能会有性能影响,但是在这两方面都有解决方案,我希望 Firefox 不久就能解决这些限制。
如果使用 RDF/XML,那么要意识到 Firefox 在解析 RDF 时不进行良构性检查。因此,Firefox 在处理 RSS 1.0 Web feeds(这是 RDF)时不考虑良构性,这是不幸的,因为 Web 社区正在试图增加良构 Web feeds 的强制性。
让 Firefox 以非一般方式显示任意 XML 最容易的方法是使用样式表。Firefox 支持级联样式表和 XSLT。我不打算过多地讨论这些技术在 Firefox 中的使用,因为 IBM developerWorks 已经为这个主题提供了一组深入的教程。更多细节请参见 参考资料。我在这里要提到的一件事是,必须确保任何样式表都是从与源代码 XML 文档相同的互联网域装载的,否则 Firefox 就不会装载和应用样式表。这个安全限制是为了避免跨站点脚本攻击(XSS)。
即使在 XSLT 这样的已经建立的标准中,在引擎之间行为还是有差异的。如果需要指定一部分 XSLT 只在 Mozilla 和 Firefox 下执行,也就是说只在任何形式的 Transformiix(与 Mozilla 绑定的 XSLT 引擎)下执行,那么使用 清单 5 这样的条件块。
|
每种 XSLT 引擎对于 system-property
都有不同的值,如果需要,可以使用 xsl:choose
来提供每种引擎特定的部分。
|
可以看到,Firefox 有许多功能。可以在简化的逻辑视图中或以原始的源代码形式查看 XML。Firefox 会报告任何良构性错误。可以使用 CSS 或 XSLT 来调整显示。Firefox 可以根据 MIME 类型识别出几种重要的 XML 词汇表并进行相应的处理。Firefox 在处理 XML 方面有一些限制。所有主流浏览器在 XML 支持方面都还需要改进,理解它们的能力和限制是很重要的。随着基于 XML 的技术(比如 Web feeds、SVG 和 XSLT)日益重要,可以期待浏览器中的 XML 支持会越来越好。目前已经可以在 Firefox 中对 XML 进行许多处理。IBM developerWorks 上这个系列中以后的文章会介绍更多内容。
总的来说,Firefox 对 DTD 的内部子集进行检查来识别内部一般实体,从而正确地处理它们。所有其他非字符实体类型都被忽略,而且不进行检验,即使对于内部子集中的声明。