文档级自定义项中的 XML 架构和数据
重要事项 本主题中所述与 Microsoft Word 相关的信息,专为美国及其各州之外的个体和组织呈现和使用,此外,正在使用或开发用于在由 Microsoft 于 2010 年 1 月之前(Microsoft 于此期间从 Microsoft Word 中删除了与自定义 XML 相关的特殊功能的实现)授予许可的 Microsoft Word 产品上运行的程序的个体和组织,也可以参考该信息。 凡位于美国及其各州内的个体或组织,在使用或开发用于在由 Microsoft 于 2010 年 1 月 10 日之后授予许可的 Microsoft Word 产品上运行的程序时,请勿参考或使用此与 Microsoft Word 相关的信息;这些产品与此许可日期之前的产品,或在美国以外的国家/地区销售和授予使用许可的产品的行为不同。
**适用于:**本主题中的信息适用于以下应用程序的文档级项目:Excel 2007 和 Excel 2010;Word 2007 和 Word 2010。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能。
Microsoft Office Excel 和 Microsoft Office Word 提供了用于将架构映射到文档的功能。 此功能可以简化在文档中导入和导出 XML 数据的操作。
Visual Studio 以编程模型中的控件的形式在文档级自定义项中公开映射的架构元素。 对于 Excel,Visual Studio 增加了将控件绑定到数据库、Web 服务及对象中的数据的支持。 Visual Studio 还为 Word 和 Excel 增加了对操作窗格的支持,可以将操作窗格与架构映射文档一起使用,为解决方案的最终用户带来更佳的体验。 有关更多信息,请参见操作窗格概述。
提示
不能在 Excel 解决方案中使用多部分 XML 架构。
架构附加到 Excel 工作簿时创建的对象
将架构附加到在工作簿时,Visual Studio 将自动创建若干对象,并将它们添加到项目中。 由于这些对象由 Excel 进行管理,因此不应使用 Visual Studio 工具删除这些对象。 若要删除这些对象,请使用 Excel 工具将映射元素从工作表中移除或分离架构。
有两个主要对象:
XML 架构(XSD 文件)。 对于工作簿中的每个架构,Visual Studio 都会向项目中添加一个架构。 该架构在**“解决方案资源管理器”**中显示为一个带 XSD 扩展名的项目项。
类型化 DataSet 类。 此类是基于架构创建的。 此数据集类在**“类视图”**中可见。
当架构元素映射到 Excel 工作表时创建的对象
将来自**“XML 源”**任务窗格的架构元素映射到工作表时,Visual Studio 会自动创建几个对象并将它们添加到项目中:
控件。 对于工作簿中的每个映射对象,都会在编程模型中创建一个 XmlMappedRange 控件(用于非重复架构元素)或 ListObject 控件(用于重复架构元素)。 只有通过从工作簿中删除映射和映射对象,才能将 ListObject 控件删除。 有关控件的更多信息,请参见 宿主项和宿主控件概述。
BindingSource。 通过将非重复架构元素映射到工作表创建 XmlMappedRange 时,会创建一个 BindingSource 并将 XmlMappedRange 控件绑定到 BindingSource。 必须将 BindingSource 绑定到与映射到文档的架构匹配的数据源的实例,如创建的类型化 DataSet 类的实例。 通过设置**“属性”**窗口中公开的 DataSource 和 DataMember 属性创建绑定。
提示
BindingSource 不是为 ListObject 对象创建的。 必须通过设置“属性”窗口中的 DataSource 和 DataMember 属性将 ListObject 手动绑定到数据源。
Office 映射架构与 Visual Studio 数据源窗口
Office 的映射架构功能和 Visual Studio**“数据源”**窗口可以帮助您在 Excel 工作表上呈现数据,以用于报告或编辑。 在这两种情况下,都可以将数据元素拖到 Excel 工作表上。 这两种方法都会创建通过 BindingSource 绑定到数据源(如 DataSet 或 Web 服务)的控件。
提示
当您将重复的架构元素映射到工作表时,Visual Studio 会创建一个 ListObject。 ListObject 不是通过 BindingSource 自动绑定到数据的。 必须通过设置“属性”窗口中的 DataSource 和 DataMember 属性将 ListObject 手动绑定到数据源。
下表显示了这两种方法之间的一些差异。
XML 架构 |
“数据源”窗口 |
---|---|
使用 Office 界面。 |
使用 Visual Studio 中的“数据源”窗口。 |
启用内置 Office 功能,以便在 XML 文件中导入和导出数据。 |
必须以编程方式提供导入和导出功能。 |
必须编写代码以使用数据填充生成的控件。 |
从“数据源”窗口添加的控件具有自动生成的填充控件的代码,使用数据库服务器时还会有必要的连接字符串。 |
架构附加到 Word 文档时的行为
将架构附加到在文档级 Office 项目中使用的 Word 文档时,并不会创建数据对象。 但是,将架构元素映射到文档时会创建控件。 控件的类型取决于所映射的元素的类型;重复元素生成 XMLNodes 控件,非重复元素生成 XMLNode 控件。 有关更多信息,请参见XMLNodes 控件和XMLNode 控件。
部署包含 XML 架构的解决方案
应该创建一个安装程序,以部署使用映射到文档的 XML 架构的解决方案。 该安装程序应该在用户计算机上的架构库中注册此架构。 如果没有注册此架构,解决方案也仍然能工作,因为 Word 会在用户打开文档时根据文档中的元素创建一个临时架构。 但是,用户将不能根据用于创建项目的架构进行验证或将此架构保存。 有关安装程序的更多信息,请参见 部署应用程序和组件。
也可以向项目添加代码,以检查架构是否位于库中,以及是否已经注册。 如果未在库中或未注册,可以向用户发出警告。
' Ensure that the schema is in the library and registered with the document.
Private Function CheckSchema() As Boolean
Const namespaceUri As String = "http://schemas.contoso.com/projects"
Dim namespaceFound As Boolean = False
Dim namespaceRegistered As Boolean = False
Dim n As Word.XMLNamespace
For Each n In Application.XMLNamespaces
If (n.URI = namespaceUri) Then
namespaceFound = True
End If
Next
If Not namespaceFound Then
MessageBox.Show("XML Schema is not in library.")
Return False
End If
Dim r As Word.XMLSchemaReference
For Each r In Me.XMLSchemaReferences
If (r.NamespaceURI = namespaceUri) Then
namespaceRegistered = True
End If
Next
If Not namespaceRegistered Then
MessageBox.Show("XML Schema is not registered for this document.")
Return False
End If
Return True
End Function
// 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;
}