Microsoft Office Word 2003 中的 XML

Microsoft Office Word 2003 中的 XML

发布日期: 11/26/2004 | 更新日期: 11/26/2004

Aaron Skonnard

几年以前,我开始着手一个新书项目时,就决定用 XML 来编写整个项目。我认为用 XML 完成该书可让我在其他地方重复使用内容、将内容转换为其他输出格式,并且可以方便地利用众多 XML 技术(包括 XPath、XSLT、各种 XML API、甚至是 XQuery)。

当我开始调查如何完成该项目的时候,我打开了 Microsoft® Office Word 2000,并开始进行试验。我不断寻找既可以使用 Word 的多信息编辑和格式功能来创作章节,又可以定义 Word 文档和 XML 结构之间的映射的方法。这可让我在熟悉的 Word 环境中工作来生成 XML 内容。当我试验“Save as HTML”功能时(当时使 Word 生成标记文档只有这种技术可以使用),显然还需要“Save as XML”选项。因此,我返回去使用出色的旧版 Emacs 来手工编写 XML。在完成数以千计的尖括号之后,我发誓再也不这么做了。

尽管用 XML 编写整本书非常有价值,但过程实在太痛苦了。幸好,现在可以使用 Microsoft Office Word 2003 了。

Word 2003 中的 XML 支持

Word 2003 中新增的 XML 支持是其最令人兴奋和最强大的功能之一。XML 不再是事后想到的内容;Word 已经针对 XML 进行了完整设计。它支持称为 Word 标记语言 (WordML) 的原生 XML 词汇。有关 WordML 的详细信息,可以从 Microsoft Office Word 2003 Preview 找到。

Microsoft Office Word 2003 引入了生成 WordML 文档的“Save as XML”命令。从这以后,当您双击一个由 Word 生成的 XML 文档时,Windows 加载程序会自动将该文件与 Word 进行关联。WordML 非常强大和灵活,足以捕获整个往返过程中 Word 文档的所有多信息编辑和格式。如果在 Word 中创建一个普通文档,将其保存为 WordML,然后再从 Word 中打开它,该文档保证与原始文档一样。

下面是 WorldML 文档的基本结构:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Word.Document"?>
<w:wordDocument 
    xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" ...
>
   <!-- WordML structure goes here -->
</w:wordDocument>

请注意,这就是一个 XML 文档。根元素的名称 wordDocument 来自 http://schemas.microsoft.com/office/word/2003/WordML 命名空间(在本专栏中,我将使用前缀“w”来引用这个命名空间)。当您从 Windows 资源管理器中双击该文件时,Windows® 会自动确定它是 WordML 文档(通过检查顶部的 mso-application 处理说明),然后启动 Word 来处理它。

WordML 的引入可能是 Microsoft Office Word 2003 中最为重要的更改,但绝不是唯一的更改。开发人员还可以将自定义的 XML 架构定义和 XSLT 转换附加到 Word 文档。开发人员可以利用附加架构中的元素来标记内容,这样就可以插入用于简化处理过程的有意义的业务特定标记。当您在 Word 中保存文档时,它可以根据附加的架构来验证文档,并可以在处理过程中应用自定义的 XSLT 转换。本专栏的其余部分将更详细地分析这些吸引人的新功能。

WordML 简介

WordML 架构旨在镜像传统 .doc 文件中的信息。WordML 的架构是 Microsoft Word XML 内容开发工具包 (CDK) Beta 2 的组成部分,您可以从 MSDN 的 Microsoft Office 2003 Downloads 进行下载。WordML 文档的根元素始终为 w:wordDocument。w:wordDocument 包含表示完整 Word 文档结构(包括属性、字体、列表、样式以及包含章节和段落的实际文档正文)的几个其他元素,如图 1 所示。

图 2 显示了具有普通格式的 Word 文档,包括指定样式(例如 Heading 1)、内嵌样式(粗体和斜体)和简单的正文。

fig02

图 2 WordML 格式的文档

 

图 2 中所示的文档的 o:DocumentProperties 元素包含可用于所有 Office 文档的文档属性,例如标题、作者、上次修改者、创建日期、上次保存日期等等(请参见图 3)。o:DocumentProperties 元素来自不同于 WordML 的命名空间,因为它会应用到所有 Office 文档,并且将跨其他 Office XML 词汇(例如 ExcelML)进行共享。

w:fonts 和 w:styles 元素包含文档中使用的字体和样式信息。文档中使用的每种字体或样式都将使用其中一个元素中的 XML 元素来表示。图 4 展示了您在图 2 中所见的文档的字体和样式信息。

w:docPr 元素包含给定文档的 Word 特定属性,例如视图和缩放设置,如下面的代码片段所示:

<w:docPr>
  <w:view w:val="print"/>
  <w:zoom w:percent="100"/>
  <w:doNotEmbedSystemFonts/>
  <w:proofState w:spelling="clean" w:grammar="clean"/>
  <w:attachedTemplate w:val=""/>
  <w:defaultTabStop w:val="720"/>
  <w:characterSpacingControl w:val="DontCompress"/>
  ...
</w:docPr>

最后,w:body 是文档内容所在的位置。w:body 元素包含章节,而章节包含段落和表格。段落和表格是分别使用 w:p 和 w:tbl 元素创建的。段落和表格最终由文本运行元素 (w:r) 组成,该元素可以使用其他属性和样式加以批注。图 5 展示了图 2 中所示的文档的 w:body 元素。

正如您看到的那样,原始 Word 文档中的所有格式都会以某种形式在 WordML 文档中表示出来。这样就可以在不丢失任何信息的情况下,在 .doc 文件和 .xml 文件之间移动数据。

使用 WordML

文档使用 WordML 格式的主要好处在于,您可以使用任何编程语言在任何平台上利用 XML API(DOM、SAX、XmlReader 等等)来处理它们。您还可以使用像 XPath 和 XSLT 这样的高级 XML 服务来处理 WordML 文档。例如,使用以下 XPath 表达式,可以很轻松地打开一个 WordML 文档,并标识以 Heading 1 样式标记的所有 w:p 元素:

//w:p[w:pPr/w:pStyle/@w:val = 'Heading 1']

您还可以编写 XSLT 转换,以便在 WordML 和其他基于文本的格式之间转换。 例如,图 6 中所示的 XSLT 展示了一种将 WordML 转换为简单 HTML 结构的方法。 对图 2 中所示的 WordML 文档运行该转换会生成图 7 中所示的 HTML 文档。 WordMLHTML(另一个转换可以从 WordML to HTML XSL Transformation 中获得。)?

fig07

图 7 文档转换到 HTML

 

除了更方便地处理 Word 文档外,WordML 还可以更加方便地生成 Word 文档。因为它们就是 XML,您可以使用任何用于生成 XML 的标准技术来生成 Word 文档。例如,您可以轻松地即时编写可生成 WordML 文档的 ASP.NET 页面,图 8 中阐释了这种技术。

fig09

图 9 ASP.NET 页

 

该 ASP.NET 页会生成相同的文档,只是现在标题包含“Hello [name]”,其中 [name] 将替换为在查询字符串中提供的值。使用查询字符串“?name=Aaron”浏览到该 ASP.NET 页,会生成图 9 中所示的文档。

自定义架构

除了 WordML 以外,Microsoft Office Word 2003 还包括对自定义 XML 架构定义 (XSD) 的支持,这使您可以将一个或多个自定义架构附加到给定的 Word 文档中。然后,您可以用附加架构中的元素对文档进行批注。这样,您可以将与业务相关的标记插入到文档中,以便可以根据业务标识符(而不是更通用的 WordML 标记)来处理文档。

例如,请考虑一个包含新员工信息的 XML 文档。您可以使用图 10 中所示的员工架构中的元素来批注该文档。要完成该操作,您必须首先将架构附加到 Word 中的 XML 文档。

通过从菜单中选择“Tools | Template and Add-Ins”,您可以将 XML 架构定义附加到一个 Word 文档。出现的对话框将包含一个“XML 架构”选项卡,您可以在其中管理架构库,并选择要附加到该特定文档的架构(请参见图 11)。您还可以指出 Word 是否应该验证文档,以及它是否应该允许用户保存无效的文档。

fig11

图 11 管理架构

 

在添加架构后,就可以开始利用该架构中的元素批注文档。Word 中的“XML 结构”窗格(显示在右侧)可让您将附加架构中的自定义元素插入到文档中。“XML 结构”窗格还为您提供了一个针对当前整个文档中存在的自定义元素的界面,方法是在该窗格内显示这些元素的逻辑树结构。

图 12 显示了“XML 结构”窗格,以及如何选择一个自定义元素以插入到文档中。在此例中,我从 urn:employees 命名空间中选择了 Employee 元素来插入到文档中。当我双击某个自定义元素时,Word 会将当前突出显示的文本包括在该元素中。在第一次插入自定义元素时,Word 会询问您是否要包围整个文档,这通常是您想要执行的操作。

fig12

图 12 将自定义元素插入到文档中

 

在您完成该操作后,Word 将在文档中显示 XML 标记,以便您可以看到它们出现的位置。图 12 展示了在插入 Employee 元素包围整个文档后该文档的样子。如果您不想看到可见的 XML 标记,可以通过取消选中“Show XML tags in the document”复选框来隐藏它们。

fig13

图 13 嵌入式元素的树结构

 

在将其他元素插入到文档时,Word 会在“XML 结构”窗格的顶部显示自定义元素的逻辑树结构。该视图只显示嵌入式自定义元素,这样在其中选择文本会非常方便(如图 13 中的 Last 元素所示)。

架构验证

在插入自定义元素后,Word 将开始验证文档内容(假设您在附加架构时选择了该选项)。在文档左下方出现的紫色线(如图 12 所示)表示 Employee 元素的内容在当前是无效的(因为它在此例中缺少一些必需的子元素)。“XML 结构”窗格中 Employee 元素旁边的黄色图标表示相同的情况。右键单击这两项中的任一项就会显示该问题。

当您将光标放在 Employee 元素内时,Word 会根据该架构自动确定 Employee 下允许的子元素,并在“XML 结构”窗格的底部显示它们。在此例中,Word 显示了 ID、Name 和 Phone 元素,这样可以非常轻松地选择一些文本并快速地应用它们(请参见图 12)。

Word 还会根据架构中提供的简单类型定义来验证文本内容。例如,图 10 中的架构包含两个简单类型:一个称为 SSN,另一个称为 Phone。这两个简单类型都使用模式面(正则表达式)来限制字符串。图 14 展示了操作中的简单类型验证。请注意,如果它没有位于简单类型的值空间中,那么紫色线会出现在文本下方。在这种情况下,如果您右键单击它,Word 会指出该文本没有遵循必需的模式 (\d{3}-\d{2}-\d{4})。在您键入时,会即时发生这些情况。

fig14

图 14 类型验证

 

在您添加所有必需的元素并使文本符合正在使用的简单类型定义后,该文档应该如图 13 所示。在所有紫色线都消失后,您就知道该文档是有效的了。默认情况下,Word 不会让您将存在验证问题的文档保存为 XML。但是,选择“Allow saving as XML even if not valid”选项(请参见图 11)可以在文档尚未完全有效的情况下保存文档。当您保存带有自定义元素的文档时,您必须决定是否要在输出中包含 WordML 标记。

保存文档

在保存带有自定义元素的 Word 文档时,您有两个选项。默认选项是将文档保存为带有嵌入到树中的自定义元素的 WordML。另一个选项是“Save data only”,它将删除 WordML 标记,并且只保留自定义元素的树结构。

例如,图 15 展示了 Employee 和 ID 元素在图 13 所示文档的 WordML 中出现的位置。需要注意的一件事情是,根据该架构,Employee 元素不会正式允许包含除 ID、Name 和 Phone 之外的子元素,因此 w:p 子元素会使该文档无效。您可能会问,既然在保存前已经没有任何紫色指示符了,那么 Word 如何将文档视为有效呢?这表明,在忽略 WordML 标记存在的情况下(因为您可以选择排除它),Word 具有足够的智能来确定有效性。

fig16

图 16 仅保存为数据

 

当您选择“Save data only”(请参见图 16)时,Word 会删除 WordML 标记,并只保存文档中的自定义元素。但是,这样做会导致您丢失可能已经应用到文档中的所有特殊格式。图 17 显示了在以这种方式保存时 employee 文档的样子。请注意,完全符合附加架构的 XML 文档就更加简单和清晰了。

fig17

图 17 没有格式的文档

 

应用转换

在保存文档时,您可能希望同时生成完全不同的格式(可能甚至不是 XML)。 为了满足这个要求,Word 可以在保存过程中应用 XSLT 转换。 通过选择“Save As”对话框中的“Apply transform”选项,您可以指定一个转换(请参见图 16)。 简单地从磁盘中选择一个 XSLT,Word 将运行该转换,并在您每次保存该文档时输出结果。

您可以通过架构库将多个转换与给定的架构相关联,从而创建所谓的 Word 解决方案。 这样,对于所有实现给定架构的文档来说,这些转换都可用。 如果您可以将多个 XSLT 转换用于某个给定文档,则 Word 将在“XML 文档”窗格(位于右侧)中启用它们,这可让您在 Word 中同一文档的多个视图之间轻松地切换。

Word 还支持在打开文档的同时使用转换。 Word 在“Open”对话框中提供了“Open as XML”选项,以便您可以选择想要使用的特定转换。 当您选择该选项时,Word 会打开应用转换的结果,而不是您选择打开的原始文档。

小结

在添加 XML 支持以后,Microsoft Office Word 2003 就大大超越了先前的版本。 对 WordML 的原生支持可以在无需抛开 XML API 优点的同时构建强大而灵活的内容解决方案。 另外,对 XML 架构、实时验证以及各种 XSLT 技术的内置支持,使得利用自定义 XML 架构和输出格式信手拈来。

除了此处描述的核心 XML 功能以外,Microsoft Office Word 2003 还可以完全通过 Visual Basic® for Applications 和 Microsoft Word XML CDK Beta 2 进行编程。Microsoft Office Word 2003 将对使用文档驱动其业务的组织产生巨大影响。 有关完整示例,请查看包含在 CDK (Microsoft Office 2003 Downloads) 中的 DocLibrary (Contoso, LLC) 示例。

请将给 Aaron 的问题和意见发送至 [email protected]

Aaron Skonnard 是 Northface University (http://www.northface.edu) 的助教兼 .NET 项目的主管,他正在努力将这所学校建成全球最好的软件开发人员大学。 Essential XML Quick ReferenceEssential XMLAaron 与他人合著了 Essential XML Quick Reference(Addison-Wesley,2001 年)和 Essential XML(Addison-Wesley,2000 年)。您可以通过http://www.skonnard.com与 Aaron 取得联系。

猜你喜欢

转载自xinklabi.iteye.com/blog/1851548