[Office] 修復 Xml parsing error 的 Word Docx 檔案
今天家人想要用 Word 開啟一個 .docx 的檔案時,
出現了如下的錯誤訊息,說 Xml parsing error:
如果用 Windows 版的中文 Office 開啟,
訊息會是類似「元素結束標記中的名稱必須和開始標記中的元素型別相符」…
不過意思差不多,就是 XML 的結構有問題,該成對的標記沒有成對…
網路上有一些號稱可以修復 Office 文件的工具,不過似乎大部分都要錢…
既然知道是 XML 結構的問題,
來試著手動修正錯誤看看吧~
1. 解壓縮 docx 檔案
.docx 事實上是個 zip 檔案,
把它更名成 .zip 後應該就能解壓縮~
或是在 Mac/Linux 上直接用 unzip 指令解開,
像下面的指令會將 wrong.docx 的內容解壓縮到 src 這個目錄下:
unzip wrong.docx -d src
2. 修正 document.xml 中的錯誤配對
找一個 XML 編輯器,從解壓縮的檔案裡面,
打開 word/document.xml 吧,
如果是有驗證 XML 結構的編輯器更好~
像我是用 Oxygen XML Editor,
用驗證 (Validate) 功能可以找到 XML 中的錯誤。
只要看 Oxygen XML Editor 列出來的 Fatal errors 就好,
因為這些是真正造成結構不對稱的元兇~
舉例來說,下面的訊息就是說 <mc:Fallback> 這個標記沒有對應的 </mc:Fallback> 標記:
如果沒有 XML 專用的編輯器,其實也可以用一般的文書編輯器 (如 Sublime Text),
再利用瀏覽器 (像 Chrome) 來開啟 XML 檔,
XML 結構如果有嚴重的問題,一樣看的到:
驗證 XML 結構是否正確很簡單,
但要修正錯誤,就頗為困難…
像是我點一下 Oxygen XML Editor 指出來的錯誤,
它會將錯誤的區塊選取起來,如下所示:
但這樣只知道這個選取區域結尾的 </w:p> 有問題,
Oxygen XML Editor 認為這裡應該要有個 </mc:Fallback> 才對。
但是,並不是直接把 </w:p> 改成 </mc:Fallback> 就成對了…
觀察一下左邊的 Outline 視窗,
注意到這個 mc:Fallback 的區塊是在 mc:AlternateContent 區塊裡面,
裡面包含了 mc:Choice 和 mc:Fallback 兩個區塊:
這個 Outline 的結構示意並不一定正確,
只是照著目前 XML 的內容來顯示,但可以給我們一些提示…
分別點擊一下這三個區塊,看一下被選取的區塊的上下內容,
可以發現結構大概是像這樣:
<w:p> <w:pPr> <w:pStyle /> <w:ind /> </w:pPr> <w:r> <w:rPr> <w:noProof /> </w:rPr> <w:lastRenderedPageBreak /> <mc:AlternateContent> <mc:Choice> ...... ...... </mc:Choice> <mc:Fallback> ...... </w:p>
以這個結構來看,感覺是:
- 缺少對應的 </mc:Fallback>
- 缺少對應的 </mc:AlternateContent>
- 缺少對應的 </w:r>
以這例子來說,就是在 <mc:Fallback> 區塊結束的地方,
補上 </mc:Fallback></mc:AlternateContent></w:r> 就可以了~
補上之後,再重做 XML 驗證,
如果還有錯誤,就持續修正~
我大概修正同樣的問題 4 次後,手上這個 document.xml 才沒有錯誤了~
有人可能會問,這個最後的 </w:p>,
怎麼知道是對到最前面那個 <w:p>,而不是其他的 <w:p> 呢?
一旦對錯位置,修正的東西可能是完全不對的…
這個問題我也是一直反覆觀察有問題區塊的上下文,
才推敲出可能的結構的,
每個人遇到的文件損毀狀況可能不同,得自己觀察看看…
3. 產生修正後的 docx 檔案
document.xml 在修正完後記得存檔,
接著將原本從 docx 檔解壓縮出來的東西,全部再壓縮回 zip 檔案,
更改副檔名成 .docx 就行了~
像我前面用 unzip 解開,就也用 zip 壓回 docx:
cd src zip -r ../fix.docx .
最後再用 Word 開啟重新壓好的 docx 檔案,
如果能成功開啟沒有錯誤的話,就成功啦~
這次的修正經驗蠻有趣的,雖然過程有點辛苦,
不過因為錯誤的類型都一樣,所以後來的錯誤修正很快,
小小經驗分享給大家囉~^^
參考資料:
9 ways to recover a corrupt Microsoft Office file