本文概述了 Eclipse 平台如何支持 XML(可扩展标记语言,Extensible Markup Language)开发。Eclipse 并不直接支持 XML 代码编辑。然而,因为 Eclipse 是一个用于构建开发人员工具的与平台无关的框架,因此可以相对容易地添加对新语言的支持。
已经开发出了许多 XML 插件,新的插件也不断得以创建。本文主要讨论名为 XMLBuddy 的插件,因为它丰富的功能集合包含 XML 文档开发所需的大多数功能。我们也会提到其它插件,这些插件能为特定任务提供更丰富的用户选项集。本文将使您熟悉基本的 XML 编辑功能,但要记住:Eclipse 是一个可以让无数工具和功能为您所用的动态框架集。
Eclipse XML 编辑器
Eclipse 已经包括一个非常简单的 XML 编辑器的源代码,这个编辑器只提供 XML 语法的突出显示。它继承 org.eclipse.ui.editors 包中包括的类,这个包为 Eclipse 平台提供一个标准文本编辑器和基于文件的文档提供程序。这个简单的 XML 编辑器起着代码示例的作用,您可以把它作为自己的 Eclipse XML 插件的基础。它的源代码只能通过 Eclipse 项目向导生成,您需要按下面所描述的自己编译它。
要构建这个基本 XML 编辑器,转至菜单 File => New,然后选择 Project。在项目向导中,选择 Plug-in Development => Plug-in Project。
如果看不到 Plug-in Development 选项,则表示 Eclipse 平台 Runtime Binary 没有 Plug-in 开发环境。请到 eclipse.org 下载页面下载 Eclipse 平台 Plug-in SDK。
单击 Next。给项目命名(如 org.my.eclipse.xmleditor),单击 Next,然后接受屏幕 Plug-in Project Structure 上的缺省值。接下来选择 Create a plug-in project using a code generation 向导,然后选择 Plug-in with an editor 选项。向导会自动生成该 XML 编辑器的源代码。
但仍需编译它。单击 Next,然后在下一屏幕 Simple Plug-in Content 上单击 Finish 选项;转至 Project 菜单并选择 Rebuild All 来构建该项目。
接下来需要使用 File => Export 菜单创建 editor.jar 文件。请退出 Eclipse,然后复制整个 org.my.eclipse.xmleditor plugin 目录。当您再次运行 Eclipse 时,可将一个 XML 文件添加到您的项目中,了解 XML 语法突出显示是如何工作的(请参阅图 1)。请记住这个样本 XML 编辑器未提供任何一种验证或语法检查。
图 1. 由 Eclipse XML 编辑器提供的简单的语法突出显示
用 XMLBuddy 编写 XML
最受欢迎且最高级的 Eclipse XML 编辑器插件是由 Bocaloco Software 开发的 XMLBuddy。XMLBuddy 是免费插件,它为 Eclipse 增添了 XML 编辑能力,其中包括对用户可配置的语法着色、DTD 驱动的代码辅助、验证以及同步的提纲视图。XML Buddy 还为 Workspace 添加 XML 透视图,为 XML 文档和 DTD 添加新的项目模板。您可以象安装任何其它 Eclipse 插件那样安装 XMLBuddy:只需将插件压缩文件解压缩至主 Eclipse 安装目录下的 \eclipse\plugins 子目录即可。记住要重新启动 Eclipse。图 2 显示操作中的 XMLBuddy。
图 2. 操作中的 XMLBuddy:带 XML Outline 视图的主编辑器窗口
XML 是元标记语言。XML 元素由起始标记、结束标记和二者之间的数据组成,因此有了语法突出显示还需要好的编辑功能。XMLBuddy(目前是版本 0.2)用以下 XML 编辑功能扩展 Eclipse:
● 格式化。可以通过选择全部或部分代码对整个 XML 文档或部分文档自动进行格式化。
● 高级语法着色。可通过 Window => Preferences => XML => Colors 菜单配置 XML 代码着色。着色可用于普通 XML 文档、DTD(内部或外部子集)和 JSP 文件。图 3 演示如何更改语法突出显示的缺省设置。
图 3. 更改 XML 语法突出显示的缺省设置
● XML 代码辅助。根据文档的 DTD,可为元素或其它标记名称、属性名称及属性值提供辅助。
● 扩展字符编码支持。XMLBuddy 根据 XML 1.0 规范自动检测文档编码,它接受 <?xml 编码声明(如果提供了的话)。也可以为所有的 XML 文档或只为特定的某个文件指定缺省编码。
● 提纲(Outline)视图。提纲视图窗口显示文档中元素的结构。缺省情况下,提纲与编辑动态同步。这能使您快速浏览文档的逻辑。
● DTD 生成。可以动态地从文档的内容生成 DTD。XMLBuddy 在本地高速缓存基于因特网的 DTD,因此不管要使用 DTD 和相关的文档多少次,只需下载它们一次。
验证 XML 代码并对其字符进行编码
使用 XML 文档的主要困难在于检查其内部有效性(文档逻辑的内聚性)。需要执行语法检查以了解是否所有的标记和定义都是正确的并且被正确地调用。只有语法检查通过之后,才能确认 XML 文档格式良好并可以解析文档的逻辑结构。XML 文档由 XML 解析器验证。
所有以下描述的 Eclipse XML 插件都能够执行 XML 验证,指出代码中的警告和错误。如果试图打开一个 XML 文档,XML 解析器可能会生成一个错误。可以检索精确的错误代码、错误文本甚至导致错误的那一行。可以在需要时验证 XML 文档,或在保存文档时自动验证。可以将验证错误任务作为一组进行清除。XMLBuddy 插件使用系统范围的 XML 解析器,不过,请记住 Eclipse 平台带有最好的 XML 解析器之一:Xerces(XML4J)。但并不限于 Xerces 或系统解析器,因为可使用 Run => External Tools => Configure 指向其它 XML 解析器。
另一个重要的 XMLBuddy 功能是支持不同的字符编码。这迟早会有用,例如,当需要使用以不同语言(如波兰语和英语)编写的 XML 可移植文档时。这不是一项简单的任务,因为编码波兰语字符主要有三种方法:其一是由 Windows 9x/2000 使用的 Windows Latin-2(CP1250);其二是在因特网中使用以及由 UNIX 与类 UNIX 系统(如 Linux)使用的 ISO Latin-2(ISO8859-2);其三是 MacOS 和 MacOS X,它们对波兰语使用不同的字符编码标准。
通常,XMLBuddy 为字符编码提供两种解决方案:根据文件内容自动检测 XML 文档编码,或将其设置为缺省的编码。缺省的编码可以在工作空间范围,也可特定于资源。要打开 XML 编码首选项,可选择 Window => Preferences => XML => Encoding。
这些针对字符编码的解决方案的问题在于:对 XML 而言,一种编码(每个工作台一种)不能适应全部情况。XML 文档可能来自世界各地任意数量的来源。在许多情况下,用户不能控制其他人对文档的编码,而且可能没有办法按编码界限划分工作。同一编码首选项将很难同时适合(比方说) Java 源文件和 XML 文档。当一组全局首选项不能满足需要时,XMLBuddy 为每个文档提供属性。指定项目中每个文件的属性是一项繁重的任务。但是,当要处理的某一文档使用了不常用的编码(不能自动检测该编码,并且没有在文档中指定)时,则属性是唯一的解决方案。要打开特定文件的编码属性,可在文件上单击鼠标右键并选择 Properties = > XML => Encoding。图 4 显示了如何设置全局字符编码。
图 4. 在 Eclipse 中设置 XML 文档的全局字符编码
DTD vs. XML Schema
XML Schema 指定 XML Schema 定义语言,该语言提供了描述 XML 1.0 文档结构和限制其内容的工具,其中包括那些利用 XML Namespace 的工具。模式语言自身用 XML 1.0 表示并使用名称空间,它在很大程度上重构了 XML 1.0 DTD 具有的能力,并在一定程度上扩展了这些能力。请记住 DTD 有许多局限:
□ 对于复杂需求通常很难使用内容模型。
□ 不支持名称空间。
□ 对模块化和重用的支持非常有限。
□ 不支持对声明扩展或继承。
□ 编写、维护和读取大型 DTD 以及定义系列相关模式都很困难。
□ 没有嵌入式、结构化自我文档编制(self-documentation)(只有 <!-- comments --> 可用)。
□ 内容和属性声明不能依靠属性或元素上下文(许多 XML 语言用到这一点,但它们的 DTD 必须“允许过多东西”)。
□ 只能使用一个简单的标识属性机制(换句话说,没有唯一性作用域)。
但 XML Schema 也有不足:
□ XML Schema 比较复杂;只需要偶尔使用 XML 的程序员可能觉得它难得有些过头。
□ XML Schema 不能请求特定的根元素(因此,即使验证最简单的文档也要求额外的信息)。
□ 当描述混合内容时,根本无法约束字符数据。
□ 内容和属性声明不能依靠属性或元素上下文(这也是 DTD 的主要问题)。
□ 不能离开声明指定缺省值。
□ 元素缺省值只能是字符数据(不包含标记)。
XMLBuddy 对 DTD 和 Schema 都提供了足够的支持,但如果您需要真正优秀的 XML Schema 支持,应该使用 XSD-XML Infoset Browser for Java 插件。它是按照 W3C XML Schema 规范中描述的那样实现 XML Schema Infoset Model 的 Java 参考库。它对于任何检查、创建或修改 XML Schema 的代码都非常有用。XML Infoset Browser 提供操作 XML Schema 组件的 API,以及操作以一系列 XML 文档的 XML Schema 的(DOM 可访问的)表示的 API。XML Infoset 基本上允许两个或两个以上的程序员同时使用 Java 和 XML,因此提供了识别和创建基于 XML 的模式的标准方法。
图 5. 安装 IBM XML SQC 之后 XML Schema 验证变得可用
XML Infoset Browser 的必要补充是 IBM XML Schema Quality Checker,简称 SQC(请参阅图 5 )。SQC 是 Java 程序,它获取以 W3C XML 模式语言编写的 XML Schema 作为输入,然后诊断 Schema 语言不正确的使用。SQC 读取符合最新 XML Schema 规范的 Schema,并尝试确定它们在应用于 Schema 的各种约束下是否有效。当 SQC 遇到不符合规范的元素时,它给出诊断消息,其中可能包含关于如何修正问题的建议。对于由许多 Schema 文档(这些文档间通过 <include>、<import> 或 <redefine> 元素信息项连接)组成的 Schema,执行完整的 Schema 检查。SQC 还可以以批处理方式运行,通过一次运行检查多个 XML 模式。
其它 Eclipse XML 插件
其它有用的 XML 插件有 Transclipse 和 Eclipse Tidy。Transclipse 是 XML 转换插件。它用任何符合 JAXP 的 XSL 样式表处理器通过 XSLT 处理 XML 文档,并使用 Apache 格式化对象处理器(Formatting Objects Processor,FOP)处理 XSL-FO 文档。Transclipse 是 j2h(Java 至 HTML,Java to HTML)插件的一部分,j2h 将 Java 源代码转换成带语法突出显示的 HTML、XHTML 和 LaTeX。Eclipse Tidy 项目提供了格式化和打印 XML/HTML 文档的插件。