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 文件示例


<memo>
<date form="iso-8601">2002-08-14</date>
This is just to <strong>say</strong>:
I ate the eggs you left in the fridge
And were probably saving for breakfast.
Do you know?  They were <emph>quite</emph> rotten.
</memo>

用 Firefox 查看这个文件会产生 图 1 所示的显示。

图 1. 在 Firefox 中查看清单 1

仔细看看浏览器区域顶部的消息,即 “The document tree is shown below.”。这说明不应该把它看成 XML 的源代码视图。它只是 Firefox 认识到的文档部分的逻辑布局。它可能会忽略对您有意义但是对 Firefox 没有意义的一些细节,而且会在某些地方歪曲文档。作为歪曲的一个示例,注意 Firefox 让每个元素占一个新行,即使在源代码文档中并不是这样的。对于使用混合内容的文档,这会显著改变内容的布局。作为 Firefox 忽略细节的示例,请在浏览器中查看 清单 2。

清单 2(listing2.xml). 具有名称空间等的简单 XML 文件示例


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE memo>
<memo xmlns='http://example.com'>
<date form="iso-8601">2002-08-14</date>
This is just to <strong>say</strong>:
I ate the eggs you left in the fridge
And were probably saving for breakfast.
Do you know?  They were <emph>quite</emph> rotten.
</memo>

清单 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 元素的前面添加一个伪造的字符实体 &#1;(一些字符即使表示为实体,在 XML 中也是非法的),然后在 Firefox 中查看它。图 3 显示 Firefox 输出,这里报告了错误以及探测到这个错误的位置。

图 3. Firefox 对非良构 XML 的显示

注意,这里显示了源代码文件的一部分,足以帮助您确定错误的位置。而且,仍然可以使用 view-source 特性来查看完整的源代码文档。

XML 的类型

XML 只是一种基本格式,可以用它构建更特定的格式,Firefox 对它支持的特殊 XML 格式进行特殊的处理和显示。我在前一篇文章中涉及了其中一些格式,包括 XHTML、Scalable Vector Graphics(SVG)和 XSLT。对于判断浏览的源代码是一般的 XML,还是 XML 的某种特殊形式,Firefox 采用的主要方法是互联网媒体类型(常常称为 MIME 类型)。对于提交给浏览器的每个资源,Web 服务器会发送 MIME 类型信息。对于在本地文件系统上打开的文件,浏览器根据文件的扩展名来猜测 MIME 类型。表 1 总结了未修改过的 Firefox 安装可以识别的与 XML 相关的 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 的方式在逻辑上是相同的。

清单 3. 使用外部解析实体的 XML 文件


    <!DOCTYPE myXML[
<!ENTITY extFile SYSTEM "extFile.ent">
]>
<myXML>&extFile;</myXML>

清单 4. 没有实体的 XML,但是 Firefox 在逻辑上按照与清单 3 相同的方式处理它


    <myXML></myXML>

对外部实体的支持可能会导致安全问题,还可能会有性能影响,但是在这两方面都有解决方案,我希望 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)。

Firefox 特定的 XSLT

即使在 XSLT 这样的已经建立的标准中,在引擎之间行为还是有差异的。如果需要指定一部分 XSLT 只在 Mozilla 和 Firefox 下执行,也就是说只在任何形式的 Transformiix(与 Mozilla 绑定的 XSLT 引擎)下执行,那么使用 清单 5 这样的条件块。

清单 5. XSLT 中 Mozilla 特定的代码块示例


<xsl:if test="system-property('xsl:vendor')='Transformiix'">
<xsl:text>This will only be output by
Firefox/Mozilla/Transformiix</xsl:text>
</xsl:if>

每种 XSLT 引擎对于 system-property 都有不同的值,如果需要,可以使用 xsl:choose 来提供每种引擎特定的部分。

结束语

关于实体的混淆

XML 有许多类型的实体,“实体” 这个术语产生了许多混淆。不幸的是,这些混淆影响了 Firefox 的文档和讨论。我在 Mozilla FAQ 和一些 bugzilla 条目中找到了这样的混淆。我在我的 Weblog 文章 “Internal entities in browsers” 中报告了一些混淆。

下面是一些重要的实体类型,以及 Mozilla 和 Firefox 中提供的支持。

  • 字符实体:完全支持。
  • 内部一般实体(声明为字面的良构的 XML 片段):只要在内部 DTD 子集中定义,就完全支持。
  • 外部解析的一般实体(声明为对外部资源的引用):不支持(忽略)。
  • 参数实体(DTD 片段):不支持(忽略)。
  • 未解析的实体:不支持(忽略)。

可以看到,Firefox 有许多功能。可以在简化的逻辑视图中或以原始的源代码形式查看 XML。Firefox 会报告任何良构性错误。可以使用 CSS 或 XSLT 来调整显示。Firefox 可以根据 MIME 类型识别出几种重要的 XML 词汇表并进行相应的处理。Firefox 在处理 XML 方面有一些限制。所有主流浏览器在 XML 支持方面都还需要改进,理解它们的能力和限制是很重要的。随着基于 XML 的技术(比如 Web feeds、SVG 和 XSLT)日益重要,可以期待浏览器中的 XML 支持会越来越好。目前已经可以在 Firefox 中对 XML 进行许多处理。IBM developerWorks 上这个系列中以后的文章会介绍更多内容。

总的来说,Firefox 对 DTD 的内部子集进行检查来识别内部一般实体,从而正确地处理它们。所有其他非字符实体类型都被忽略,而且不进行检验,即使对于内部子集中的声明。

相关文章:Firefox 1.5 中的 XML,第 1 部分: XML 特性概述

Firefox 1.5 中的 XML,第 2 部分: 基本 XML 处理相关推荐

  1. spring REST中的内容协商(同一资源,多种展现:xml,json,html)

    为什么80%的码农都做不了架构师?>>>    一.REST内容协商介绍  RESTful服务中很重要的一个特性即是同一资源,多种表述.也即如下面描述的三种方式: 1.使用http ...

  2. JDOM是JAVA中最常用的一种解析XML的工具

    JDOM是JAVA中最常用的一种解析XML的工具,我们可以从JDOM的官方网站www.jdom.org 下载JDOM1.0.ZIP压缩包,将其解压,将JDOM.JAR文件配置到classpath当中去 ...

  3. 利用opencv中的类FileStorage生成和读取XML和YAML文件

    有时候程序中的变量值.字符串.数组等数据也需要独立于源代码本身保存,这个时候就需要用到XML和YAML文件进行保存. OpenCV4提供了用于生成和读取XML文件和YAML文件的类FileStorag ...

  4. 【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 )

    文章目录 一.创建 XmlParser 解析器 二.获取 Xml 文件中的节点 三.获取 Xml 文件中的节点属性 四.完整代码示例 一.创建 XmlParser 解析器 创建 XmlParser 解 ...

  5. html中div不在火狐居中,Firefox嵌套CSS中div标签居中问题解决方法

    本文和大家重点讨论一下Firefox嵌套CSS中div标签的居中问题的解决方法,主要包括使用line-height垂直居中,清除容器浮动,不让链接折行,始终让Firefox显示滚动条等内容. Fire ...

  6. 用linq查询html中div个数,C#使用Linq to XML进行XPath查询

    最近在用到HtmlAgliltyPack进行结点查询时,发现这里选择结点使用的是XPath.所以这里总结一下在C#中使用XPath查询XML的方式.习惯了用Linq,这里也是用的Linq to xml ...

  7. IIS中“使用 XSL 样式表无法查看 XML 输入”问题的解决

    IIS中"使用 XSL 样式表无法查看 XML 输入"问题的解决 2009-05-13 15:15 今日安装IIS后,随便写了一个aspx的文件作为测试,发现浏览器中显示:使用 X ...

  8. IE6.0、IE7.0 、FireFox 在样式中的不同写法.doc

    IE6.0.IE7.0 .FireFox 在样式中的不同写法 2009年3月26日 15:44:27 发布:hugo 或许你一直在抱怨为什么要专门为IE和FF写不同的CSS,为什么IE这样让人头疼,然 ...

  9. [html] 如何解决input在Firefox和Chrome中高度不一致的问题?

    [html] 如何解决input在Firefox和Chrome中高度不一致的问题? 原因是firefox的input的border-width padding 受win10系统的文本大小设置影响设置一 ...

最新文章

  1. C++中rdbuf()简介及文件流的概念
  2. html表单注册功能的实现,仅一个form表单 js实现注册信息依次填写提交功能
  3. JAVA中dis_求助!!为什么我的dispose()不起作用
  4. nssl1299-选做作业【最大流,最小割,最大子权闭合图】
  5. html右缩进怎么设置,WPS中怎么设置右缩进两个字符?
  6. 95-910-330-源码-FlinkSQL-Calcite-Flink结合Calcite
  7. 多线程之同步synchronized的使用不当造成java.lang.IllegalMonitorStateException 异常
  8. 迅捷pdf在线转换html,迅捷pdf在线转换成word免费版在线版
  9. C语言实现贪吃蛇[内附详细步骤]
  10. c语言编程模拟银行取钱代码,C语言 用初等函数模拟银行取款
  11. [原创]佰志达SBO网上商城系统业务框架介绍
  12. git pull 报错:‘info: detecting host provider for’
  13. 上周AI热点回顾:AI“模拟”出暗物质、AI挖掘毕加索秘密、CPU在大型神经网络超越V100 GPU...
  14. Java—求绝对值(选择结构)
  15. 汇川AM402、H3U和上位机C#ModebusTcp通讯
  16. UE4 IOS打包详解
  17. 成功没有偶然·李嘉诚 之读书笔记
  18. 关于微信微信 onresp 收不到返回的结果
  19. org.glassfish:javax.el:pom:3.0.1-b06-SNAPSHOT was not found in https://repository.apache.org/snapsho
  20. 微信小程序之图片删除

热门文章

  1. 地图制作|AI编辑标准地图,制作符合出版需要的地图文件
  2. [Android Studio]申请摄像头权限失败
  3. python小程序短信发送助手
  4. 北漂码农的真实心声:赚一线城市的钱,还二线城市的房贷
  5. 四旋翼飞行器2——自己设计四旋翼飞行器的硬件准备和基础知识
  6. android使用popupwindow仿微信点赞功能
  7. 晨哥真有料丨心理学“踢猫效应”,拒绝传递负能量
  8. June 8th ipod
  9. 优秀景区小程序开发案例赏析
  10. c++获取mac操作系统的版本号