TLDR/问题
如何最好地将唯一 ID 分配给 XML 中描述 Word 文档的元素(理想情况下是所有元素),以便我可以从 Word (2013) 加载项中读取/写入这些唯一 ID?
此外,描述我可以获得两个 Word 文档的良好差异的方法的解决方案可能会有所帮助,但这不是主要问题。
背景
我正在使用 VSTO 为 Word (2013) 创建应用程序级加载项。我的部分任务涉及将原始 Word 文档W
与修改后的文档进行W'
比较,以便我可以为另一个任务处理差异。虽然 Word 显然具有差异/合并功能(在 Word 2013 的“审阅”面板中可用),但到目前为止,我还没有找到一种以编程方式提取差异的方法。
因此,我计划获取文档的 XML(例如使用Range.WordOpenXML
)并区分它们。有许多已发布的用于区分 XML 文档(即Diff(W.XML, W'.XML)
diff)的算法,其中 diff 的准确性很大程度上取决于能否正确匹配两个文档中的 XML 元素。
提出的解决方案及其问题
因此,我希望能够为我可以从我的加载项访问的 Word 文档的 XML 中的每个元素分配一个唯一的 ID。在这种情况下,解决方案类似于将自定义命名空间导入到调用的包中,并为 DOCX 包中的每个元素mynamespace
添加属性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 处理器并为其提供自定义命令?)。