使用自定义 XML 标记
使用自定义 XML 标记
本指南展示了如何读取和管理 Word 文档可携带的自定义 XML 数据,这些数据与可见内容一起存在——用于绑定内容控件、存储特定应用程序的元数据或嵌入任意包部件。Document.CustomXmlParts 暴露文档级别的自定义 XML 数据,而 Document.PackageCustomParts 暴露包级别的自定义部件,这些部件并非特定的自定义 XML。
自定义 XML 部件
CustomXmlPart 表示附加到文档的一个自定义 XML 数据岛——与 Word 用于支撑 XML 映射的内容控件的机制相同。每个部件都有一个 Id、一个保存原始 XML 的 Data 字节数组、一个 DataChecksum,以及一个 Schemas 属性(一个 CustomXmlSchemaCollection),列出与之关联的 XML 架构。Document.CustomXmlParts 返回一个 CustomXmlPartCollection:Add(part) 附加现有的 CustomXmlPart,Add(id, xml) 直接从 id 和 XML 字符串创建一个,GetById(id) 检索特定部件,RemoveAt(index)/Clear() 删除部件。CustomXmlPart 和 CustomXmlPartCollection 都暴露 Clone() 用于复制自定义 XML 数据,例如在文档之间复制内容时。
自定义 XML 架构
CustomXmlSchemaCollection(通过 CustomXmlPart.Schemas 访问)列出与自定义 XML 部件关联的架构 URI。它支持 Add(value)、Remove(name)、RemoveAt(index)、IndexOf(value)、Clear() 和 Clone(),以及一个 Count 属性——架构 URI 被作为普通字符串而非已解析的架构对象进行跟踪。
自定义 XML 属性
与 CustomXmlPart 分开,CustomXmlProperty 表示单个名称/值 XML 属性,由 CustomXmlProperty(name, uri, value) 构造并公开 Name、Uri 和 Value。CustomXmlPropertyCollection 管理这些属性的集合:Add(property) 添加一个,索引器(例如 properties["MyProp"])可按名称查找并使用 Contains(name) 检查其是否存在,IndexOfKey(name) 返回其位置,Remove(name)/RemoveAt(index)/Clear() 则删除条目。SmartTag.Properties 返回一个 CustomXmlPropertyCollection,这就是旧版智能标签的结构化数据的表示方式(见下文)。
包级自定义部件
Document.PackageCustomParts 返回一个 CustomPartCollection,其中包含 CustomPart 对象——存储在 OOXML 包中的任意部件,这些部件不是自定义 XML 数据,例如由其他修改文件的应用程序添加的部件。每个 CustomPart 都有一个 Name、ContentType、RelationshipType、一个 Data 字节数组,以及一个 IsExternal 标志,指示该部件是外部引用还是嵌入内容。该集合支持 Add(part)、RemoveAt(index)、Clear() 和 Clone(),以及 Count。
旧版智能标签
SmartTag 是一种节点类型(NodeType.SmartTag),表示围绕已识别文本的旧版 Word 智能标签。SmartTag 通过 SmartTag(doc) 构造,并公开 Element(识别器元素名称)和 Uri(识别器的命名空间),以及 Properties——一个保存识别器附加到标记文本的结构化数据的 CustomXmlPropertyCollection。由于 SmartTag 是节点,它同其他节点一样参与文档树,支持 Accept(visitor)、AcceptStart(visitor) 和 AcceptEnd(visitor) 以进行基于 DocumentVisitor 的遍历。
MarkupLevel
MarkupLevel 是一个枚举——Unknown、Inline、Block、Row、Cell——用于描述文档树中标记元素(例如结构化文档标签)可能出现的结构层级。
提示与最佳实践
- 当您已知所需部件的 ID 时,请使用
CustomXmlPartCollection.GetById(id)而不是手动遍历集合。 - 读取
CustomXmlPart.DataChecksum以检测底层 XML 数据是否已更改,而无需进行完整的字节比较。 - 区分
Document.CustomXmlParts(自定义 XML 数据,通常绑定到内容控件)和Document.PackageCustomParts(任意非 XML 的包部件)——它们用途不同,且存储方式也不同。 - 在处理使用智能标签的旧版文档时,请同时检查
SmartTag.Element和Uri以确定是哪种识别器创建了标签,然后再依赖其Properties。 - 在文档之间复制数据时,使用
CustomXmlPart.Clone()(或集合的Clone())克隆自定义 XML 部件,而不是重新读取并重新添加原始的 XML。
常见问题
| 问题 | 原因 | 修复 |
|---|---|---|
CustomXmlPartCollection.GetById(id) 返回无可用内容 | 该 id 与 Document.CustomXmlParts 中当前的任何部分不匹配 | 枚举集合以确认 id,或先使用 Add(id, xml) 添加该部分 |
| 自定义 XML 数据似乎与可见的内容控件无关 | 内容控件通过其自身的数据绑定配置绑定到自定义 XML,而不会自动绑定到每个 CustomXmlPart | 确认给定内容控件绑定到哪个部件,而不是假设与 Document.CustomXmlParts 之间是一对一关系 |
另一个应用程序添加的包部件在 CustomXmlParts 中未找到 | 非 XML 包部件通过 Document.PackageCustomParts 暴露,而不是通过 CustomXmlParts | 请检查 PackageCustomParts(一个 CustomPartCollection) |
SmartTag.Properties 为空 | 并非所有智能标签识别器都会附加结构化属性 | 请检查 SmartTag.Element/Uri,以确认是哪个识别器创建了该标签,然后再期望特定属性 |
FAQ
CustomXmlPart 与 CustomXmlProperty 有何区别?
CustomXmlPart 是一个完整的 XML 数据岛(包含字节数组负载和相关模式),通过 Document.CustomXmlParts 访问。CustomXmlProperty 是单个名称/值对,通常通过 SmartTag.Properties 而不是直接从文档中获取。
我如何向文档添加自定义 XML 数据?
使用 ID 字符串和 XML 内容调用 Document.CustomXmlParts.Add(id, xml),或者单独构造一个 CustomXmlPart 并将其传递给 Add(part)。
什么是包自定义部件,它们与自定义 XML 部件有何区别?
Document.PackageCustomParts(一个包含 CustomPart 对象的 CustomPartCollection)保存任意非自定义 XML 的 OOXML 包部件——每个部件都有一个 ContentType、RelationshipType 和原始的 Data。Document.CustomXmlParts 专用于自定义 XML 数据岛。
什么是 SmartTag?
SmartTag 是 Word 的旧版功能,表示由智能标签识别器识别并包装的文本。它是一个文档节点(NodeType.SmartTag),具有用于标识识别器的 Element 和 Uri,以及一个包含识别器附加的 CustomXmlProperty 值的 Properties 集合。
我如何在文档之间复制自定义 XML 数据?
在源部分使用 CustomXmlPart.Clone(),然后将克隆添加到目标文档的 Document.CustomXmlParts,并使用 Add(part)。
API Reference 摘要
| 类/方法 | 描述 |
|---|---|
CustomXmlPart | 附加到文档的单个自定义 XML 数据岛 |
Document.CustomXmlParts | 文档上所有自定义 XML 部件的 CustomXmlPartCollection |
CustomXmlPartCollection.Add(id, xml) / GetById(id) | 通过 ID 添加或检索自定义 XML 部件 |
CustomXmlSchemaCollection | 与 CustomXmlPart 关联的模式 URI |
CustomXmlProperty | 单个名称/值 XML 属性 |
CustomXmlPropertyCollection | 一组 CustomXmlProperty 值,例如在 SmartTag.Properties |
Document.PackageCustomParts | 任意非-XML OOXML 包部件的 CustomPartCollection |
CustomPart | 一个包级自定义部件,包含 Name、ContentType 和原始 Data |
SmartTag | 由智能标签识别器识别的包装文本的旧版节点类型 |
MarkupLevel | 枚举描述标记元素在文档树中的出现位置 |