5

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 プロセッサにフックしてカスタム コマンドを与える方法があるのではないでしょうか?)。

4

1 に答える 1

0

将来の視聴者のために:

1) ほとんどの要素に任意の種類の id を設定する方法は絶対にありません。これは Word で存続できます (任意のカスタム タグまたは属性を使用できますが、MS Word がドキュメントを開いた後は、それはなくなります)。

2) ID として使用できるのは ContentControl の 2 つの要素のみです。それらには ID があり、ブックマーク (名前の前にアンダースコアを追加して非表示のブックマークを作成できます。コードからのみ機能します)、それらの名前は ID にすることができます。

3) Word で変更の追跡が有効になっている場合、たとえばここで説明されているように、Range.WordOpenXML を使用して実際の OpenXml を取得し、XML で差分を表示することは絶対に可能です。

于 2016-01-07T02:25:32.040 に答える