Назначение пользовательских уникальных идентификаторов элементам Word 2013 OpenXML

TLDR/ Вопрос

Как лучше всего назначить уникальные идентификаторы (в идеале всем) элементам в XML, который описывает документ Word, чтобы я мог читать / записывать эти уникальные идентификаторы из надстройки Word (2013)?

Кроме того, могут быть полезны решения, описывающие способы, которыми я могу получить хорошее различие двух документов Word, но это не основной вопрос.

Фон

Я создаю надстройку уровня приложения для Word (2013) с помощью VSTO. Часть моей задачи включает в себя распространение оригинального документа Word W с измененным W' так что я могу обработать diff для другой задачи. Несмотря на то, что в Word явно есть возможность различий / слияний (доступно на панели "Обзор" в Word 2013), до сих пор я не смог найти способ программного извлечения различий.

Поэтому я планирую получить XML для документов (например, используя Range.WordOpenXML) и различать их. Существует ряд опубликованных алгоритмов для разграничения документов XML (т.е. Diff(W.XML, W'.XML)) где точность различий в значительной степени зависит от возможности надлежащего сопоставления элементов XML из двух документов.

Предлагаемое решение и его проблемы

Поэтому я хотел бы иметь возможность назначать уникальный идентификатор для каждого элемента в XML-документе Word, к которому я могу получить доступ из своей надстройки. В этом случае решение будет что-то вроде импорта пользовательского пространства имен в пакет с именем mynamespace и добавив атрибут mynamespace:ID=*** для каждого элемента в пакете DOCX. Атрибут будет доступен через 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 видно, что этот процесс использования пользовательского xml через часть совместимости и расширяемости разметки стандарта Office Open XML имеет с годами усложняются (проблемы с патентами и т. д.). Поэтому я предполагаю, что мои проблемы возникают из-за того, что XML-процессор Word просто удаляет всю разметку, которую он не может обработать изначально (может быть, есть способ подключиться к XML-процессору Word и дать ему специальные команды?).

1 ответ

Для будущих зрителей:

1) Абсолютно нет способа установить какой-либо идентификатор для большинства элементов, которые могут сохраняться в Word (вы можете использовать любые пользовательские теги или атрибуты, но после того, как MS Word откроет документ, он исчезнет)

2) В качестве идентификатора могут использоваться только два элемента - ContentControl, у них есть идентификаторы и закладки (можно сделать скрытую закладку, добавив подчеркивание перед его именем, она работает только из кода), их имя может быть идентификатором.

3) Если отслеживание изменений включено в Word, абсолютно возможно увидеть различия в XML, используя Range.WordOpenXML и получая из него реальный OpenXml, как описано здесь, например.

Другие вопросы по тегам