为Word 2013 OpenXML元素分配自定义唯一ID

时间:2015-06-16 05:24:01

标签: ms-word openxml office-addins word-2013 word-addins

TLDR /问题

如何最好地为描述Word文档的XML中的(理想情况下所有)元素分配唯一ID,以便我可以从Word(2013)加载项读取/写入这些唯一ID?

此外,描述我可以获得两个Word文档的良好差异的解决方案可能会有所帮助,但这不是主要问题。

背景

我正在使用VSTO为Word(2013)创建应用程序级外接程序。我的任务的一部分涉及使用修改后的W来区分原始Word文档W',以便我可以处理另一个任务的差异。虽然Word显然具有差异/合并的功能(在Word 2013的“评论”面板中可用),但迄今为止我还没有找到一种以编程方式提取差异的方法。

因此,我计划获取文档的XML(例如使用Range.WordOpenXML)并对它们进行区分。有许多已发布的用于区分XML文档的算法(即Diff(W.XML, W'.XML)),其中diff的准确性在很大程度上取决于能否正确匹配两个文档中的XML元素。

提出的解决方案及其问题

因此,我希望能够为我可以从我的加载项访问的Word文档的XML中的每个元素分配一个唯一的ID。在这种情况下,解决方案就像将自定义命名空间导入名为mynamespace的包中,并为DOCX包中的每个元素添加属性mynamespace:ID=***。然后可以通过Range.WordOpenXML访问该属性。

但是,只需使用mce:Ignorable,mce:ProcessContent和mce:PreserveAttributes,详见http://openxmldeveloper.org/blog/b/openxmldeveloper/archive/2012/09/21/markup-compatibility-and-extensibility.aspx不起作用。修改后的Word文档加载没有任何问题,但我似乎无法找到任何属性,另外保存文档会删除所有添加的标记。

http://openxmldeveloper.org/discussions/formats/f/13/p/8078/163573.aspx看来,通过Office Open XML标准的标记兼容性和可扩展性(MCE)部分使用自定义xml的过程多年来变得复杂(专利问题等)。因此,我猜测我的问题出现了,因为Word的XML处理器只删除了它无法原生处理的所有标记(可能有一种方法可以挂钩到Word的XML处理器并为其提供自定义命令?)。

1 个答案:

答案 0 :(得分:0)

对于未来的观众:

1)绝对没有办法为大多数元素设置任何类型的id,它们可以在Word中存活(你可以使用任何自定义标签或属性,但在MS Word打开文档后,它已经消失了)

2)只有两个元素可以用作id - ContentControl,它们有id和书签(可以使隐藏的书签在其名称之前添加下划线,它只能从代码中起作用),它们的名称可以是id

3)如果在Word中启用了跟踪更改,则绝对可以使用Range.WordOpenXML查看XML中的差异,并从中获取实际的OpenXml,例如,如here所述。

相关问题