文档级自定义项中的 XML 架构和数据

本主题中介绍的关于 Microsoft Word 的信息仅供个人和组织使用,这些个人和组织位于美国及其地区之外,或者正在使用或开发在 2010 年 1 月之前由 Microsoft 许可的 Microsoft Word 产品上运行的程序,而 Microsoft 从 Microsoft Word 中删除了与自定义 XML 相关的特定功能的实现。 有关 Microsoft Word 的信息不得由美国或其区域中的个人或组织读取或使用,或者开发在 2010 年 1 月 10 日之后由 Microsoft 许可的程序;这些产品的行为与在该日期之前许可或购买并许可在美国外部使用的产品的行为不同。

适用于: 本主题中的信息适用于 Excel 和 Word 的文档级项目。 有关详细信息,请参阅办公室应用程序和项目类型提供的功能。

Microsoft 办公室 Excel 和 Microsoft 办公室 Word 提供将架构映射到文档的功能。 此功能可以简化导入和导出文档中的 XML 数据。

Visual Studio 在文档级自定义中公开映射的架构元素作为编程模型中的控件。 对于 Excel,Visual Studio 添加了对将控件绑定到数据库、Web 服务和对象中的数据的支持。 对于 Word 和 Excel,Visual Studio 添加了对操作窗格的支持,这些窗格可用于架构映射文档,为解决方案创建增强的最终用户体验。 有关详细信息,请参阅 “操作”窗格概述

注意

不能在 Excel 解决方案中使用多部分 XML 架构。

将架构附加到 Excel 工作簿时创建的对象

将架构附加到工作簿时,Visual Studio 会自动创建多个对象并将其添加到项目中。 不应使用 Visual Studio 工具删除这些对象,因为它们由 Excel 管理。 若要删除这些元素,请从工作表中删除映射的元素,或使用 Excel 工具分离架构。

有两个主要对象:

  • XML 架构(XSD 文件)。 对于工作簿中的每个架构,Visual Studio 都会向项目添加架构。 这显示为解决方案资源管理器具有 XSD 扩展的项目项。

  • 类型化 DataSet 类。 此类基于架构创建。 此数据集类在 类视图中可见。

在架构元素映射到 Excel 工作表时创建的对象

将架构元素从 XML 源 任务窗格映射到工作表时,Visual Studio 会自动创建多个对象并将其添加到项目中:

办公室映射架构和 Visual Studio 数据源窗口

办公室和 Visual Studio 数据源窗口的映射架构功能都可以帮助你在 Excel 工作表上呈现数据,以便进行报告或编辑。 在这两种情况下,都可以将数据元素拖到 Excel 工作表上。 这两种方法都创建由数据绑定到 BindingSource 数据源(如 DataSet 或 Web 服务)的控件。

注意

将重复架构元素映射到工作表时,Visual Studio 将创建一个 ListObject。 不会 ListObject 通过 BindingSource. 自动绑定到数据。 必须通过在“属性”窗口中设置DataSourceDataMember属性来手动绑定到ListObject数据源。

下表显示了这两种方法之间的一些差异。

XML 架构 “数据源”窗口
使用办公室接口。 在 Visual Studio 中使用 “数据源 ”窗口。
启用内置办公室功能,以便从 XML 文件导入和导出数据。 必须以编程方式提供导入和导出功能。
必须编写代码才能使用数据填充生成的控件。 “数据源”窗口中添加的控件会自动生成代码来填充它们,以及使用数据库服务器时所需的连接字符串。

架构附加到 Word 文档时的行为

将架构附加到文档级办公室项目中使用的 Word 文档时,不会创建数据对象。 但是,将架构元素映射到文档时,将创建控件。 控件的类型取决于映射的元素类型;重复元素生成 XMLNodes 控件,非重复元素生成 XMLNode 控件。 有关详细信息,请参阅 XMLNodes 控件XMLNode 控件

部署包含 XML 架构的解决方案

应创建一个安装程序来部署使用映射到文档的 XML 架构的解决方案。 安装程序应在用户计算机上的架构库中注册架构。 如果不注册架构,解决方案仍将有效,因为 Word 会根据用户打开该架构时文档中的元素生成临时架构。 但是,用户将无法针对或保存用于创建项目的架构执行验证。 有关安装程序的详细信息,请参阅 部署应用程序、服务和组件

还可以将代码添加到项目,检查架构是否在库中并注册。 如果没有,可以警告用户。

// Ensure that the schema is in the library and registered with the document.
private bool CheckSchema()
{
    const string namespaceUri = "http://schemas.contoso.com/projects";
    bool namespaceFound = false;
    bool namespaceRegistered = false;

    foreach (Word.XMLNamespace n in Application.XMLNamespaces)
    {
        if (n.URI == namespaceUri)
        {
            namespaceFound = true;
        }
    }

    if (!namespaceFound)
    {
        MessageBox.Show("XML Schema is not in library.");
        return false;
    }

    foreach (Word.XMLSchemaReference r in this.XMLSchemaReferences) 
    {
        if (r.NamespaceURI == namespaceUri)
        {
            namespaceRegistered = true;
        }
    }

    if (!namespaceRegistered)
    {
        MessageBox.Show("XML Schema is not registered for this document.");
        return false;
    }
    
    return true;
}