如何在 .NET 中处理自定义 XML 标记

如何在 .NET 中处理自定义 XML 标记

如何在 .NET 中使用自定义 XML 标记

Word 文档可以在其可见内容旁携带自定义 XML 数据——这些数据用于绑定内容控件、存储特定应用的元数据,或嵌入由其他应用添加的部件。本文档展示了如何读取这些数据、添加新的自定义 XML 部件,以及检查较旧文档可能仍包含的传统智能标签,使用 CustomXmlPart、CustomXmlProperty 和 SmartTag 在 Aspose.Words FOSS 中针对 .NET。


分步指南

步骤 1:从文档读取自定义 XML 数据

Document.CustomXmlParts 返回一个 CustomXmlPartCollection —— 这与 Word 用于支持 XML 映射内容控件的机制相同。遍历该集合,或在已知所需部件时调用 GetById(id),以获取一个 CustomXmlPart。每个部件公开 Id,一个 Data 字节数组,保存原始 XML,以及一个用于在不进行完整字节比较的情况下检测数据是否已更改的 DataChecksum,还有 Schemas —— 一个列出与其关联的 XML 架构的 CustomXmlSchemaCollection。


步骤 2:添加或更新自定义 XML 部件

调用 CustomXmlPartCollection.Add(id, xml) 并提供 id 字符串和 XML 内容以直接创建部件,或者单独构造一个 CustomXmlPart 并将其传递给 Add(part)。要删除数据,可在特定位置使用 RemoveAt(index),或使用 Clear() 删除所有部件。复制自定义 XML 数据到文档之间时,使用源部件上的 CustomXmlPart.Clone()(或集合的 Clone()),而不是重新读取并重新添加原始 XML,然后将克隆添加到目标文档的 Document.CustomXmlParts。


步骤 3:管理与部件关联的模式

CustomXmlPart.Schemas 达到一个 CustomXmlSchemaCollection,该对象将与部件关联的模式 URI 记录为普通字符串,而不是已解析的模式对象。使用 Add(value) 注册模式 URI,使用 Remove(name) 或 RemoveAt(index) 删除某个 URI,使用 IndexOf(value) 定位某个 URI,使用 Clear() 删除全部。Count 报告当前与部件关联的模式 URI 数量。


步骤 4:处理包级自定义部件

并非 OOXML 包中所有不可见的部件都是自定义 XML。Document.PackageCustomParts 返回一个包含 CustomPart 对象的 CustomPartCollection —— 存储在包中的任意部件,例如被其他应用程序触碰后添加的部件。每个 CustomPart 都有一个 Name、ContentType、RelationshipType、一个 Data 字节数组,以及一个 IsExternal 标志,用于指示它是外部引用还是嵌入内容。Add(part)、RemoveAt(index) 和 Clear() 以与 CustomXmlPartCollection 相同的方式管理该集合。当文档应包含的部件未出现在自定义 XML 集合中时,请检查 PackageCustomParts —— 而不是 CustomXmlParts ——。


步骤 5:检查旧版智能标签及其属性

SmartTag 是一种节点类型(NodeType.SmartTag,使用 SmartTag(doc) 构造),表示包装在已识别文本周围的旧版 Word 智能标签。检查 Element 和 Uri 以确定是哪个识别器创建了该标签,然后读取 Properties —— 一个 CustomXmlPropertyCollection —— 来获取识别器附加的结构化数据。在 CustomXmlPropertyCollection 中,索引器(例如 properties["MyProp"])或 Contains(name) 查找特定属性,IndexOfKey(name) 返回其位置,Remove(name)/RemoveAt(index)/Clear() 删除条目;每个 CustomXmlProperty 使用 CustomXmlProperty(name, uri, value) 构造,并公开 Name、Uri 和 Value。由于 SmartTag 派生自 CompositeNode,它也像其他节点一样参与文档树,支持用于基于 DocumentVisitor 的遍历的 Accept(visitor)、AcceptStart(visitor) 和 AcceptEnd(visitor)。


常见问题与解决方案

CustomXmlPartCollection.GetById(id) 返回的内容不可用。 该 ID 与当前的任何部件都不匹配 Document.CustomXmlParts。枚举集合以确认该 ID 是否存在,或先使用以下方式添加部件: Add(id, xml).

通过遍历未能找到由其他应用程序添加的部件 CustomXmlParts. 非-XML 包部件通过 Document.PackageCustomParts, 而不是 CustomXmlParts。检查 PackageCustomParts (a CustomPartCollection) 而不是。

SmartTag.Properties 是空的,尽管标签显然存在。 并非所有智能标签识别器都会附加结构化属性。请检查 SmartTag.Element and Uri 以确认是哪个识别器创建了该标签,然后再假设会存在特定属性。

自定义 XML 数据似乎与其应绑定的内容控件无关。 内容控件通过其自身的数据绑定配置绑定到自定义 XML,而不是自动绑定到每个 CustomXmlPart in Document.CustomXmlParts. 确认给定内容控件实际绑定到哪一部分,而不是假设是一对一的关系。


常见问题

如何向文档添加自定义 XML 数据?

调用 Document.CustomXmlParts.Add(id, xml) 并提供 ID 字符串和 XML 内容,或单独构造一个 CustomXmlPart 并将其传递给 Add(part)。

CustomXmlPart 和 CustomXmlProperty 之间有什么区别?

CustomXmlPart 是一个完整的 XML 数据岛——一个字节数组负载加上相关模式——通过 Document.CustomXmlParts 访问。CustomXmlProperty 是一个单一的名称/值对,通常通过 SmartTag.Properties 而不是直接从文档中获取。

如何将自定义的 XML 数据从一个文档复制到另一个文档?

在源 CustomXmlPart 上调用 Clone(),然后使用 Add(part) 将克隆添加到目标文档的 Document.CustomXmlParts。

什么是 SmartTag,以及何时会遇到它?

SmartTag 是一种遗留的 Word 功能,表示由智能标签识别器识别并包装的文本——一个文档节点(NodeType.SmartTag),其中包含用于标识识别器的 Element 和 Uri,以及一个 Properties 的 CustomXmlProperty 值集合。它出现在使用旧版 Word 启用智能标签创建或编辑的文档中。

我如何知道文档中有多少自定义的 XML 部分或 package parts?

分别读取 Document.CustomXmlParts(一个 CustomXmlPartCollection)上的 Count,或 Document.PackageCustomParts(一个 CustomPartCollection)上的相应属性。


另请参阅

 中文