« エクセルの「区切り位置」という機能 | トップページ | AngleSharpでHTMLファイルを更新する »

2024年8月25日 (日)

Microsoft Wordの変更履歴の記録に使うXML要素

Microsoft Wordの.docxファイルというのは、実態はzipファイルで、中にいくつかのファイルが入っている。そのうち主要部分はdocument.xmlというXMLファイル。これはOffice Open XML (ECMA 376 / ISO/IEC 29500) という標準のうち、WordprocessingML というマークアップ言語 (というか、XMLスキーマ) に基づいている (*1)。ここまでは、割と良く知られていると思う。

それで、ちょっと事情があって、WordprocessingMLで、Wordの「変更履歴の記録」の機能がどういう風に表現されるのか調べた。そしたらこれが非常に複雑で、専門家と思われる人が書いた解説に矛盾があったりして (某氏のブログでは「以下に示す28種類の要素が」と書いた後の表が26項目しかない、など…) 全体を把握するのに苦労した。そこで、理解できたことの要点だけまとめておく。

(詳細を説明すると膨大な文章になってしまうので、要素の一覧と、仕様の該当箇所だけ。)

変更履歴の記録に使うXML要素

分類 要素 定義の場所 一言説明
cellDel 17.13.5.1 表のセルを削除
cellIns 17.13.5.2 表のセルを追加
cellMerge 17.13.5.3 表のセルを結合/解除
tcPrChange 17.13.5.36 表のセルの書式を変更
trPrChange 17.13.5.37 表の行の書式を変更
tblGridChange 17.13.5.33 表の列の書式を変更
tblPrChange 17.13.5.34 表の書式を変更
tblPrExChange 17.13.5.35 表の例外書式を変更
挿入削除 del 17.13.5.12~15 削除
ins 17.13.5.16~20 挿入
moveFrom 17.13.5.21~22 移動元 (移動の操作によって削除)
moveFromRangeStart 17.13.5.24 移動元の範囲の先頭の印
moveFromRangeEnd 17.13.5.23 移動元の範囲の末尾の印
moveTo 17.13.5.25~26 移動先 (移動の操作によって挿入)
moveToRangeStart 17.13.5.28 移動先の範囲の先頭の印
moveToRangeEnd 17.13.5.27 移動先の範囲の末尾の印
delInstrText 17.16.13 削除されたフィールドコード文字列
delText 17.3.3.7 削除された文字列
書式 rPrChange 17.13.5.30~31 文字書式の変更
pPrChange 17.13.5.29 段落書式の変更
sectPrChange 17.13.5.32 セクション書式の変更
NumberingChange (記載なし) 段落番号の変更

「定義の場所」は、ISO/IEC 29500-1の箇条番号。ここからPDFをダウンロードできる (「EN」というリンクをクリック。その下のElectronic Insertsでスキーマ定義のファイルなどもダウンロード可)。なお、この話の詳細を知るために29500を読む場合は、いきなり17.13.5.Xを読むのではなく、まず「8. Overview」を読み、次に「Annex L」の「L.1」(4,538ページから) を読むといいと思う。

NumberingChangeというのは、ECMA 376の初版に含まれていたが、その後削除された要素。このため、現在の29500には記載がないが、私が使う予定のOpenXML SDKはサポートしているし、今でもNumberingChangeを含んだdocxファイルは使われているらしいので、上の表に入れておいた。

他に、カスタムXMLマークアップの変更に使う要素が8種定義されている (17.13.5.4~11) が、興味ないし普通の人は使わない機能 (*2) だと思うので省略。


*1: 歴史的に正確に言うと、これは逆で、国際標準がWordの.docxファイル仕様に基づいている、というのが正しい。現在の.docxファイルというのは、もともとMicrosoft Office 2007のときにプロプラ仕様として作ったものを、Officeのバージョンアップのたびに少しずつ手直ししたものだ。他方ISO/IEC 29500というのは、このOffice 2007の.docxファイルを基にした国際標準として後から仕様化したものだが、このときに「いくらなんでも、これはダメでしょう」とか「国際標準としてここはマズいんじゃ」みたいな部分をちょっと変更したのでOffice 2007の.docxと少し違ってしまったのだ。

*2: カスタムXMLマークアップというのは、ワードの文章中にOffice OpenXMLとは別のXML要素を埋め込んでおいてユーザーアプリが自由に使うという機能。要は、XMLなんだから名前空間を分ければ何でも混ぜることができるわけなのだが、Word 2007にこの機能が追加されたときに、特許侵害と言われて裁判が起きた。莫大な損害賠償を請求された結果、マイクロソフトは (比較的少額の) 賠償金を支払い当該機能をOfficeから削除するということで和解した。この和解を履行するために、Word 2010以降のWordはカスタムXMLマークアップを新規に追加できないばかりか、Word 2007で作成されたカスタムXMLマークアップを含むdocxファイルを開いた際に強制的にカスタムXMLマークアップを全削除するという機能が追加された。

« エクセルの「区切り位置」という機能 | トップページ | AngleSharpでHTMLファイルを更新する »

コメント

コメントを書く

(ウェブ上には掲載しません)

« エクセルの「区切り位置」という機能 | トップページ | AngleSharpでHTMLファイルを更新する »