标记兼容性简介

本主题介绍 Open XML SDK for Office 中包含的标记兼容性功能。

简介

假设您具有一个使用 Microsoft Office 2013 中引入的功能的 Microsoft Word 2013 文档。 当您在较早版本的 Microsoft Word 2010 中打开该文档时,应该会发生什么情况? 理想情况下,您希望该文档保持与 Word 2010 的可互操作性,即使 Word 2010 不能理解此新功能。

还应考虑,如果您在某个假定的更高版本的 Office 中打开该文档,应该会发生什么情况? 同样,您希望该文档按预期方式工作。 也就是说,您希望此更高版本的 Office 能理解和支持由 Word 2013 生成的文档中使用的功能。

Open XML 预计到了这些情况。 Office Open XML 文件格式规范在 ECMA-376 第二版的第 3 部分 - 标记兼容性和扩展性(该链接可能指向英文页面)中介绍了用于达到上述预期结果的工具。

Open XML SDK 支持标记兼容性,使你可以轻松地为 和 Office 2013 实现上述所需结果,而无需成为规范详细信息方面的专家。

什么是标记兼容性?

Open XML 采用特定标记语言(即 WordprocessingML、SpreadsheetML 和 PresentationML)的形式,定义字处理文档、电子表格文档和演示文稿文档的格式。 对于 Open XML 文件格式而言,标记兼容性是指以上述标记语言之一表示的文档能够促进应用程序之间或一个应用程序的不同版本(具有不同的功能集)之间进行互操作。 通过使用 Open XML 规范的标记兼容性命名空间中的一组定义的 XML 元素和属性,可支持这一点。 请注意,当文档格式中支持标记时,标记的生成者和使用者(如 Microsoft Word)也必须支持它。 换句话说,互操作性是在文件格式和应用程序中均受支持的一项功能。

Open XML 文件格式规范中的标记兼容性

标记兼容性在 ECMA-376 第二版的第 3 部分 - 标记兼容性和扩展性(该链接可能指向英文页面)中进行了讨论,建议您阅读该文档以了解标记兼容性。 该规范定义 XML 属性来表示兼容性规则并定义 XML 元素来指定替换内容。 例如, Ignorable 属性指定一些命名空间,如果使用这些命名空间的应用程序无法理解它们,则可将其忽略。 替换内容元素指定可由应用程序在运行时选择的替换标记。 例如,Word 2013 只能选择它可识别的替换标记。 该规范中提供了有关兼容性规则属性和替换内容元素及其详细信息的完整列表。

对标记兼容性的 Open XML SDK 支持

Open XML SDK 为标记兼容性所做的工作是详细而微妙的。 但是,其目标可以概述为,使用您在打开文档时分配的设置对文档进行预处理,从而:

  1. 从无法理解的命名空间(例如,在 Office 2010 上下文中打开的 Office 2013 文档)中筛选或移除任何元素
  2. 按照 Open XML 规范中的规定处理任何标记兼容性元素和属性。

根据 ECMA-376 第二版的 3.13 部分执行预处理。

对标记兼容性的 Open XML SDK 支持主要以两个类的形式提供,以及按照 ECMA-376 第二版预处理内容的方式。 这两个类分别为 OpenSettingsMarkupCompatibilityProcessSettings。 使用前者可提供适用于 SDK 总体行为的设置。 使用后者可提供这些设置的一部分,尤其是应用于标记兼容性的设置。

在打开时设置阶段

使用 Open XML SDK 打开文档时,可以选择使用具有接受 OpenSettings 类实例作为参数的签名的重载。 使用打开设置类可提供一些用于控制 SDK 行为的重要设置。 存储在 MarkupCompatibilityProcessSettings 属性中的一组设置尤其确定如何处理标记兼容性元素和属性。 在打开文档之前,将 属性设置为 MarkupCompatibilityProcessSettings 类的 实例。

该类具有以下属性:

默认情况下,不对文档进行预处理。 然而,如果您指定打开设置并提供标记兼容性处理设置,则将根据这些设置对文档进行预处理。

下面的代码示例演示如何使用打开设置类的一个实例作为参数来调用 Open 方法。 请注意, ProcessModeTargetFileFormatVersions 属性可作为 MarkupCompatiblityProcessSettings 构造函数的一部分进行初始化。

    // Create instance of OpenSettings
    OpenSettings openSettings = new OpenSettings();

    // Add the MarkupCompatibilityProcessSettings
    openSettings.MarkupCompatibilityProcessSettings =
        new MarkupCompatibilityProcessSettings(
            MarkupCompatibilityProcessMode.ProcessAllParts, 
            FileFormatVersions.Office2007);

    // Open the document with OpenSettings
    using (WordprocessingDocument wordDocument = 
        WordprocessingDocument.Open(filename, 
            true,
            openSettings))
    {
        // ... more code here
    }

预处理期间发生的情况

在预处理期间,Open XML SDK 会删除标记兼容性命名空间中的元素和属性,删除未选择的备用内容元素的内容,并根据需要解释兼容性规则属性。 此工作由处理模式和目标文件格式版本属性进行引导。

ProcessMode 属性确定要进行预处理的部件。 这些部分中的内容经过筛选,仅包含 TargetFileFormatVersions 属性中指示的应用程序版本所理解的元素。

警告

[!警告] 预处理操作会影响保存的内容。 当保存文件时,唯一保存的标记就是在预处理后保留的标记。

了解进程模式

处理模式指定应对哪些文档部件进行预处理。 将此属性设置为 MarkupCompatibilityProcessMode 枚举的成员。 默认值 NoProcess 指示不需要执行预处理。 您的应用程序必须能够理解和处理文档标记中包含的任何元素和属性,包括标记兼容性命名空间中的任何元素和属性。

您可能希望处理特定的文档部件,同时保持其余部件不会更改。 例如,您可能希望确保对文件进行最小程度的修改。 在这种情况下,可为处理模式指定 ProcessLoadedPartsOnly。 进行此设置后,预处理及关联的筛选将只应用到加载的文档部件,而不是整个文档。

最后,还有一个 ProcessAllParts 值。 正如其名称的含义一样,如果选择此值,则会对整个文档进行预处理。

设置目标文件格式版本

使用目标文件格式版本属性,可以选择在 Office 2010 或 Office 2013 上下文中处理标记兼容性内容。 将 TargetFileFormatVersions 属性设置为 FileFormatVersions 枚举的成员。

默认值 Office2010 意味着,SDK 将假定理解 Office 2010 中定义的命名空间,但不理解 Office 2013 中定义的命名空间。 因此,在预处理的过程中,SDK 将忽略 Office 2013 中定义的命名空间,并选择 Office 2010 兼容的替换内容。

将目标文件格式版本属性设置为 Office2013 时,Open XML SDK 假定 Office 2010 和 Office 2013 中定义的所有命名空间都已理解,不会忽略在 Office 2013 下定义的任何内容,并将选择与 Office 2013 兼容的备用内容。