TLDR/質問
Word (2013) アドインから一意の ID を読み書きできるように、Word 文書を記述する XML の要素 (理想的にはすべて) に一意の ID を割り当てるにはどうすればよいですか?
さらに、2 つの Word 文書の適切な差分を取得する方法を説明するソリューションが役立つ場合がありますが、これは主な質問ではありません。
バックグラウンド
VSTO を使用して、Word (2013) 用のアプリケーション レベルのアドインを作成しています。私のタスクの一部には、元の Word 文書W
を変更したものと比較しW'
て、別のタスクの差分を処理できるようにすることが含まれます。Word には明らかに差分/マージの機能がありますが (Word 2013 の [レビュー] パネルで利用可能)、これまでプログラムで差分を抽出する方法を見つけることができませんでした。
したがって、ドキュメントの XML を取得して (たとえば を使用してRange.WordOpenXML
)、それらを比較する予定です。XML ドキュメントを比較するアルゴリズム (つまりDiff(W.XML, W'.XML)
) は多数公開されていますが、差分の精度は、2 つのドキュメントの XML 要素を適切に一致させることができるかどうかに大きく依存します。
提案された解決策とその問題点
したがって、アドインからアクセスできる Word ドキュメントの XML 内のすべての要素に一意の ID を割り当てられるようにしたいと考えています。この場合の解決策は、呼び出されたパッケージにカスタム名前空間をインポートし、DOCX パッケージ内のすべての要素にmynamespace
属性を追加するようなものです。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 標準の Markup Compatibility and Extensibility (MCE) 部分を介してカスタム xml を使用するこのプロセスには、年々複雑化(特許問題など)。したがって、Word の XML プロセッサは、ネイティブに処理できないすべてのマークアップを削除するだけなので、問題が発生すると推測しています (Word の XML プロセッサにフックしてカスタム コマンドを与える方法があるのではないでしょうか?)。