为 Word 2013 OpenXML 元素分配自定义唯一 ID
Posted
技术标签:
【中文标题】为 Word 2013 OpenXML 元素分配自定义唯一 ID【英文标题】:Assigning Custom Unique IDs to Word 2013 OpenXML Elements 【发布时间】:2015-06-16 05:24:01 【问题描述】:TLDR/问题
如何最好地为 XML 中描述 Word 文档的元素(理想情况下为所有元素)分配唯一 ID,以便我可以从 Word (2013) 加载项中读取/写入这些唯一 ID?
此外,描述如何获得两个 Word 文档的良好差异的解决方案可能会有所帮助,但这不是主要问题。
背景
我正在使用 VSTO 为 Word (2013) 创建应用程序级加载项。我的部分任务涉及将原始 Word 文档 W
与修改后的 W'
进行比较,以便我可以为另一个任务处理差异。虽然 Word 显然具有差异/合并功能(在 Word 2013 的“审阅”面板中提供),但到目前为止,我还没有找到以编程方式提取差异的方法。
因此,我计划获取文档的 XML(例如,使用 Range.WordOpenXML
)并区分它们。有许多已发布的用于区分 XML 文档的算法(即Diff(W.XML, W'.XML)
),其中 diff 的准确性很大程度上取决于能否正确匹配两个文档中的 XML 元素。
提出的解决方案及其问题
因此,我希望能够为我可以从我的加载项访问的 Word 文档的 XML 中的每个元素分配一个唯一的 ID。在这种情况下,解决方案类似于将自定义命名空间导入名为 mynamespace
的包中,并为 DOCX 包中的每个元素添加属性 mynamespace:ID=***
。然后可以通过Range.WordOpenXML
访问该属性。
但是,仅使用 http://openxmldeveloper.org/blog/b/openxmldeveloper/archive/2012/09/21/markup-compatibility-and-extensibility.aspx 中详述的 mce:Ignorable、mce:ProcessContent 和 mce:PreserveAttributes 不起作用。修改后的 Word 文档加载没有任何问题,但我似乎找不到任何属性,另外保存文档会删除所有添加的标记。
从http://openxmldeveloper.org/discussions/formats/f/13/p/8078/163573.aspx 看来,通过 Office Open XML 标准的标记兼容性和可扩展性 (MCE) 部分使用自定义 xml 的过程多年来变得复杂(专利问题等)。因此,我猜测我的问题出现是因为 Word 的 XML 处理器只是删除了它无法本地处理的所有标记(也许有一种方法可以连接到 Word 的 XML 处理器并为其提供自定义命令?)。
【问题讨论】:
您找到解决此问题的方法了吗? (如果是这样,请回答您自己的问题,让我们其他人分享:) 【参考方案1】:对于未来的观众:
1) 绝对没有办法为大多数元素设置任何类型的 id,它可以在 Word 中生存(您可以使用任何自定义标签或属性,但是在 MS Word 打开文档后,它就消失了)
2) 只有两个元素可以用作 id - ContentControl,它们有 ids 和书签(可以在名称前添加下划线的隐藏书签,它仅适用于代码),它们的名称可以是 id .
3) 如果在 Word 中启用了跟踪更改,则绝对有可能在 XML 中看到差异,使用 Range.WordOpenXML 并从中获取实际的 OpenXml,例如 here 解释。
【讨论】:
以上是关于为 Word 2013 OpenXML 元素分配自定义唯一 ID的主要内容,如果未能解决你的问题,请参考以下文章
OpenXML - 将书签应用于 Word 文档中的段落