以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 DTD/XML Schema 』 (http://bbs.xml.org.cn/list.asp?boardid=23) ---- 使用 Emacs 来编辑 XML 文档 (http://bbs.xml.org.cn/dispbbs.asp?boardid=23&rootid=&id=12034) |
-- 作者:anchen0617 -- 发布时间:11/13/2004 2:54:00 PM -- 使用 Emacs 来编辑 XML 文档 对于 UNIX 开发人员而言,以功能强大的文本编辑器而著称的 Emacs 是用于 MS-DOS、Windows 和 MacOS 的理想 XML 编辑器。作者描述了如何正确安装附加的包并修改设置以创建带有扩展的(PSGML 和 OpenSP)Emacs 强大的 XML/SGML 编辑与验证环境。下载并安装 Emacs 和单独的几个包就可以完成大部分环境设置工作,但是还必须正确地配置 Emacs 并启用计划要使用的 DTD。本文包含一些样本配置文件和 XHTML DTD。 虽然 Emacs 以深受 UNIX 开发人员所喜爱的一种功能强大的文本编辑器而著称,但是也可以在非 UNIX 平台(例如,Windows、MS-DOS 和 MacOS)上将 Emacs 用来编辑 XML。作为一种成熟的开发环境,Emacs(请参阅边框里的 Emacs 简介)可以用来处理文本、编写应用程序以及我将要讨论的创建结构化的信息(XML 和 SGML)。我将它作为一种一般用途的编辑器,用来创建和管理我的某些编程项目,以及编写 XHTML 和处理 SGML 与 XML。事实上,我正是使用 Emacs 来写这篇文章的。 本文讲述了如何安装 Emacs,以及 PSGML 和 OpenSP 扩展。它还概述了如何定制 Emacs 以使它适合各种 DTD。我每次介绍众多 Emacs 定制中的一段。但是,您可以下载带有样本 DTD 的 zip 文件以及所有的 Emacs 定制(请参阅参考资料)。我的目的是通过提供刚好够用的信息来帮助您理解 Emacs 是怎么回事,使您能开始使用 Emacs。然后,您将能够根据需要及喜好来添加 DTD 和定制 Emacs。 获取和安装 Emacs Linux 和 UNIX 安装 Emacs 简介 Emacs 的可扩展性使它得以广泛应用。可扩展性源自 Emacs 的体系结构(这种体系结构被设计用来添加新的功能),并且和 Emacs 自身语言 Emacs Lisp 一起用于制作定制功能。可以通过变量设置和宏或者通过添加包来定制 Emacs。Emacs 是“自身可编制文档的”,它的这种方式可以让您查询其环境,这种方式还可以让您访问编辑器自身和任何已安装的包的文档。 将该分发版解压缩后,将有一些文件和在主目录下的四个子目录:bin、etc、info 和 lisp。README.W32 文件包含关于获取以后的分发版、设置 Emacs 等信息。(README 文件还包括一个有关 Windows 95/98/ME 和 2000 上 GNU Emacs 的 FAQ 的 URL。)虽然不是必须的,我还是建议您运行 bin 子目录中的 addpm.exe 以注册 Emacs,这样就可以从 start 菜单上访问它了。一旦安装了 Emacs,请选择 Start->Gnu Emacs->Emacs。如果选择不注册 Emacs,则双击安装在 d:\Emacs\bin 目录中的 runemacs.exe 文件来启动。 可以通过启动 Emacs 并选择 Help->Emacs Tutorial 来运行教程。不要因为必须使用控制键(ctrl)组合来完成许多功能而灰心。可以从学习一些常用控制键(ctrl)组合开始,然后在发现需要使用新的控制键(ctrl)组合时,再来学习它们。另外,在 Emacs 的 GUI 版本中,可以在菜单中执行许多功能。关于 Emacs 和 PSGML 其它教程的的建议,请参阅参考资料。 定制 Emacs 设置变量以控制各种行为
那么,我首先讲述如何设置变量和添加包。 第一步是访问 Emacs 初始化文件。Emacs 在主目录中寻找这个文件。在 UNIX 环境中,初始化文件通常命名为 .emacs,并且在缺省情况下,该文件位于主目录下。 在 Windows 上,我使用称为 _emacs 的文件,因为 Windows 通常不用以句点开头的文件名。在 Windows 上,通过设置环境变量或通过设置注册表项来指定主目录。如果没有进行设置,则作为最后的方法,Emacs 在目录 c:\ 下查找初始化文件。(因此,现在要么在 c:\ 中创建这个文件,要么参考 Windows 的 GNU Emacs FAQ(请参阅参考资料)以获取其它选择。) 要测试 Emacs 是否正在查找初始化文件,可以使用您喜爱的文本编辑器添加清单 1 中这一项,它会在 Emacs 状态栏中打开时钟。在打开钟并启动 Emacs 之后,在状态区中查找该时间(在当前文件名称后)。如果看到时钟,则万事大吉了。 清单 1. 测试 Emacs 初始化文件
既然已经安装了 Emacs,已经为定制它打下了基础,那么我们将考虑如何添加包,这些包为编辑和验证 SGML 和 XML 文档提供环境。 添加 PSGML 以支持 SGML 和 XML 方式 随着时间推移,SGML 正逐渐成为文档发布的流行工具,Lennart Staflin 创建了 PSGML,它是将 SGML 主要的编辑方式添加到 Emacs 的包。因为 HTML 和 XML 是 SGML 的子集,所以也可以使用 PSGML 来编辑 HTML 和 XML。实际上,最近的 PSGML 版本提供了 XML 编辑方式。 PSGML 还包括一个内置的 SGML 解析器,它可以识别 DTD。如果您有自己的 SGML 或 XML 分支语言,则可以简单地安装您的 DTD。通过安装新的 DTD(或 DTD 集)来处理 HTML 标准的变化。PSGML 提供了与上下文相关的编辑,因此可以根据在文档中的位置添加元素或属性。导航特性允许在元素中移动,甚至可以移动到 下一个故障点以定位不符合您的 DTD 的标记。格式化特性基于嵌套来缩进元素,或者隐藏元素内容,因此可以将视图限制在特定区域。最后,可以使用外部的验证解析器来验证文档,我将在本文的后面介绍。 图 1. 安装了 PSGML 的 Emacs(编辑 DITA FAQ) 带颜色的标记语法。
除了在图 1 中可以看见的特性以外,PSGML 添加了许多功能,可以通过下拉菜单、弹出菜单或控制(ctrl)键组合或命令来调用这些功能。 Windows 技巧 解压缩完毕后,请查阅 README.psgml 以获取一些基本信息,包括如何在 Emacs 的 UNIX 版本中安装 PSGML。 在 Emacs Windows 版中安装 PSGML 下一步,需要确保 Emacs 可以找到包含 PSGML 的文件。可以将清单 2 的内容添加到 Emacs 初始化文件 _emacs 中来做到这一点。 现在,Emacs 应该可以访问 PSGML 文件了,从而每当调用 sgml 方式或 xml 方式时,Emacs 都将使用 PSGML。后面我将说明如何根据正在编辑的文件的文件扩展名来自动调用那些方式。 编译 PSGML 文件 启动 Emacs。 添加 DTD 让我们从 XHTML 1.0 开始,它是 HTML 4.01 的 XML 化的版本(有关 XHTML 的更多信息,请参阅参考资料)。XHTML DTD 可使您创建符合 XML 标准并且可以用解析器验证(后面有更多关于这方面的描述)的 HTML,从而提供了更健壮和可管理性更好的文档。(可在参考资料中找到我在这一节中所讨论的 XHTML 1.0 DTD 和目录文件的 zip 文件)。 这里是关于如何下载 XHTML DTD 和相关实体的步骤: 创建 XHTML DTD 的子目录。我将所有我的 DTD 放在系统上的一个地方;假设它们驻留在与 Emacs 同级的 DTD 文件夹下:d:\DTDs。在该目录下创建 XHTML DTDs 的文件夹 d:\DTDs\xhtml1。
下一步,需要创建 SGML 目录文件,PSGML 可以使用它来查找这些 DTD。 在与这些 DTD 同一个目录下创建一个称为 xhtml1.soc 的文件。其内容应该类似于清单 3。 有关“SGML 开放目录”(SGML Open Catalogs)的背景知识,请参阅参考资料。对于本文,我只解释在清单 3 中使用的一些特殊特性。PUBLIC 项将称为正式公共标识映射到文件系统实体(在本文这种情况下,该实体是包含各种 DTD 的文件)。这允许我们引用这些 DTD,而不必知道它们在文件系统中的实际位置。这些 DTD 需要文档有 <!DOCTYPE xxxxxx PUBLIC "yyyyy"> 文档类型声明,其中“xxxxx”与目录文件中的某一项匹配。PSGML 实际上不使用 DTDDECL 项,但是 SGML 解析器(仍在调整中)将使用这些项,并且这些项表明了 SGML 声明将使用具有相同正式公共标识的 DTD。 最后,DOCTYPE 项允许我们引用特殊 DTD,而不需要使用正式公共标识或实际的文件名。这样做的缺点是,对于 XHTML,会有几个定义同一文档类型 html 的 DTD,因此必须从中选取一个。我只简单地选择最想使用的那个。在清单 3 中,选择了过渡的(transitional)DTD。请记住,只要包含全部 !DOCTYPE 声明,就可以使用任何 XHTML 文档类型。 这里还需要做一些配置。PSGML 需要知道到哪里查找 SGML 目录文件。有几种方法可以实现这一点,这在 PSGML 文档中都有所描述。我利用环境变量 SGML_CATALOG_FILES 这种方法,因为 SGML 解析器也使用它(耐心一些,我将在本文的下一节讨论它)。那么,既然已经有了一组 DTD 和一个目录文件,现在创建前面提到的环境变量,并设置它为包含指向 xhtml1.soc 文件的路径,例如,d:\DTDs\xhtml1\xhtml1.soc。如果有多个目录文件,则可以把它们都包括进来,用路径定界符来分隔它们(在 Windows 上是“;”,在基于 UNIX 的系统上是“:”)。 我将说明如何再添加一个 DTD 集: 如果必要,为新的 DTD 创建子目录,例如 d:\DTDs\dita。 -- For documents that don't include a DOCTYPE declaration -- -- There should probably be an entry here referencing the standard --
正如您所见,一旦初始设置完成,添加新的 DTD 相对比较容易。 用 PSGML 编辑文档 图 2. 带 SGML 编辑方式的 Emacs 菜单 要尝试使用 PSGML,先编辑一个称为 test.html 的测试文件,并插入 html 的开始和结束标记。 <html> 调用 [Alt]-x,然后输入 xml mode,从而开启 XML 方式。下一步,单击菜单项 DTD->Info->General DTD Info。这会使 PSGML 解析 DTD,并在文档下面的缓冲区中显示常规信息。如果测试不成功,则在目录文件或环境变量中检查错误。这个测试还假设在 SGML 目录文件的其中之一包含 DOCTYPE html 项,以便于 PSGML 知道哪个 DTD 与文档类型“html”关联。另外,可以包含一个文档类型声明,例如, <!DOCTYPE html PUBLIC ...>,其中 PUBLIC 标识符要与某个 SGML 目录文件中的一项相匹配。如果目录和环境变量设置正确,则应该看到类似下列的输出: Doctype: html 这个输出表明 PSGML 能够找到 DTD 并可以解析它,包括所有引用的实体模块。 现在,PSGML 可以支持 DTD 了,您可以开始利用 PSGML 的一些更强大的特性。例如,将光标放在 <html> 标记后,并选择菜单项 Markup->Insert Element。这会显示一个元素列表,这些元素在文档中这个位置是有效的。然而在了解更多其它的编辑特性之前,先让我们完成更多的定制来加深对 PSGML 的了解。 更多定制 清单 5 中的第一部分告诉 Emacs,当装入带有特定扩展名的文件时,调用哪种主方式,这与 Windows 中根据文件类型关联应用程序的方法类似。请注意,这里我已经将 .htm 和 .html 文件设置成使用 xml 方式。这是因为实际上我正在编写 XHTML。 清单 5 中接下来的四个部分将提供基于语法的突出显示表示法,在编辑器中,使不同标记构造以不同的颜色来表示。缺省情况下,PSGML 简单地定义标记用黑体显示,注释用斜体显示。这里,我将开始和结束标记设置成用蓝色显示,用紫色显示注释,用蓝色显示实体引用,用红紫色显示 PI 等。除了我修改的这部分结构外,您还可以定义被忽略的记号部分、记号部分的开始和结束以及简短引用的外观。这四部分的目的是: 定义 face
清单 5 的下一部分 sgml-auto-activate-dtd 使装入文档时就解析与文档关联的 DTD。缺省情况下,由于处理需要,这被设置成假。随着处理器越来越快,不用再考虑此问题。同样,如果在最初装入文档时不将 sgml-auto-activate-dtd 设置为真,则直到显式地解析 DTD 时(使用 DTD->Parse DTD 菜单项或 [Ctrl]-c[Ctrl]-p 键组合),对语法的着色才生效。 下一部分修改 DTD->Insert DTD 菜单项以允许您快速地向新文档插入 DOCTYPE 声明。我已经包含了各种文档类型,包括 SGML 和 XML 文档类型(一些被注释掉了)。请注意 XML 文档类型是如何包含 XML 声明。每当添加新的 DTD,可能想更新 sgml-custom-dtd 变量以将您的新 DTD 添加到 Insert DTD 菜单中。 最后一部分定义了 my-psgml-hook,并与 SGML 方式挂接。这允许您根据正在编辑的文件启动缺省的浏览器。这在您编辑时,便于查看 HTML 和 XHTML。当浏览器完全支持 XML 和 XSLT 时,这将更加方便。 PSGML 的快速测试运行 启动 Emacs,然后打开([Ctrl]-x[Ctrl]-f)test.html 文件。此时 Emacs 应该处于 XML 方式,可以查看状态行来验证是否处于 XML 方式。
使用 SP 或 OpenSP 进行 SGML 和 XML 验证 当从菜单调用 SGML->Validate,或在键盘上按 Ctrl-c Ctrl-v 时,PSGML 将启动一个 shell 进程以调用 SGML 解析器解来验证当前正在编辑的文件。它会在当前正在编辑的文件下的缓冲区中显示验证结果。如果遇到错误,则使用 Emacs [Ctrl]-x `(请注意是反的单引号),让 Emacs 带您到源文档中出错的位置。 缺省情况下,它被配置成调用 nsgmls(SP 的一部分),SP 是最初由 James Clark 编写的 SGML 解析器。但现在已不再支持 SP,然而 SP 是 OpenSP 的基础,现在 OpenSP 是作为在 OpenJade 项目的一部分在 SourceForge.net 上维护。(有关 SP 和 OpenSP 的更多信息,请参阅参考资料。)可以下载并使用 SP 或 OpenSP。我选择使用 OpenSP,是因为当前有组织支持它,并且它包含对 SGML 目录的 DTDDECL 关键字的支持,然而 SP 不支持它(从 OpenSP 版本 1.4 开始支持 DTDDECL)。如果只处理 XML,则仅需要为 XML 定义的单个 SGML 声明。然而,如果您还将处理 SGML,则正在使用的 DTD 将可能引用其自身的声明。因为 PSGML 仅允许您指定一个要使用的特定 SGML 声明,通过 sgml-declaration(或者 XML 方式的 sgml-xml-declaration),就可以方便地使用 DTDDECL 目录特性了。最后一个要考虑的问题是,我无法找到针对 Windows 平台的 OpenSP 的二进制文件。因为 SourceForge.net 只维护源代码,所以您需要自己构建二进制文件或通过比我更努力的搜索来找到它们。 使用 SP 清单 6. _emacs — 让 SP 来验证 ; Note the forward slashes in the path!!!!
使用 OpenSP 假设已经构建并安装了 OpenSP 或者找到预先构建好的二进制文件分发版,则要做的第一件事还是更新 PATH,这样就可以找到可执行文件了。假设 OpenSP 安装在 d:\OpenSP 中,那么需要将 d:\OpenSP\bin 添加到 PATH 中。请注意,可以同时安装 SP 和 OpenSP 这两者,并同时访问它们,因为已经重新命名了 OpenSP 中的可执行文件。 需要完成的下一步操作是更新 Emacs 配置以改变用于验证的命令。这通常是通过设置 Emacs 变量 sgml-validate-command 来完成的,实际上,我们将设置该变量以处理在 sgml 方式下使用 OpenSp 的 onsgml 可执行文件进行验证的情况。然而对于 xml 方式,这似乎不能正确工作:当我在 Emacs 初始化文件中设置该变量时,sgml 方式应用了这个变化,但是 xml 方式却没有这样。可以通过提供方式挂接(mode-hook)来解决这个问题。这个目的是覆盖缺省的验证命令(该命令被定义成 nsgmls -wxml -s %s %s),将它设置成 onsgmls -wxml -s %s %s。清单 7 中的 Emacs 初始化代码片段就是负责完成这两个任务。 您实际上不必理解是怎样使 PSGML 和 OpenSP 一起工作的。但是,如果您感兴趣,方式挂接基本上定义了一个初始化方式后将要调用的 Emacs 功能。这提供了一个机会,使您能够覆盖由那个方式建立的功能和设置。在这种情况下,因为验证命令硬连接在 PSGML 代码中,所以可以使用方式挂接来覆盖该设置,而不必修改 PSGML 代码并重新编译它(每次安装 PSGML 的新版本时,都需要完成该操作)。 建议与提示 在 SGML 菜单上,尝试 File Options 和 User Options,这些选项可以让您更好地理解在 PSGML 中可以定制什么。有关特殊设置的更多信息,请参考在线文档或查阅 PSGML 中的“Editing SGML with Emacs and PSGML”文档。在这个菜单中进行的更改只能在这个特定编辑会话期间有效。如果想作永久的更改,则必须更新 Emacs 初始化文件。 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
812.500ms |