攝影或3C

告別雜亂 XML!用 Python lxml 實現與 VS Code (Shift+Alt+F) 同級的「完美縮排」

在處理 Word (.docx) 或 Excel (.xlsx) 的底層結構時,
我們常會看到像「壓縮餅乾」一樣擠成一團的 XML 內容。
雖然使用 VS Code (Shift+Alt+F) 可以一鍵讓它變得賞心悅目,
但如果我們是在寫 Python 自動化腳本,
該怎麼讓輸出的檔案也擁有一樣漂亮的縮排呢?

Python 強大的 lxml 函式庫中的 pretty_print=True 參數,
就是程式碼界的「格式化文件」按鈕。

準備工作

首先,確保您的環境中已安裝 lxml
它比 Python 內建的 xml 模組更快、功能更強大。 

pip install lxml

實戰教學:還原 document.xml.rels

假設我們有一個剛從 Word 解壓縮出來的 document.xml.rels 檔案,
內容擠在同一行。
我們目標是將其讀取並轉換為易讀格式。

核心程式碼

from lxml import etree

# 1. 模擬原始的 Minified XML 資料 (或是從檔案讀取)
# 這裡使用截圖中的結構作為範例
raw_xml = (
    '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'
    '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">'
    '<Relationship Id="rId3" Type=".../webSettings" Target="webSettings.xml"/>'
    '<Relationship Id="rId2" Type=".../settings" Target="settings.xml"/>'
    '<Relationship Id="rId1" Type=".../styles" Target="styles.xml"/>'
    '</Relationships>'
)

# 2. 解析 XML
# 注意為了確保縮排能正確重置建議設定 remove_blank_text=True
parser = etree.XMLParser(remove_blank_text=True)
root = etree.fromstring(raw_xml.encode('utf-8'), parser=parser)

# 3. 輸出漂亮的格式 (Pretty Print)
pretty_xml = etree.tostring(
    root, 
    pretty_print=True,  # <--- 這就是魔法關鍵
    encoding='utf-8', 
    xml_declaration=True
).decode('utf-8')

print(pretty_xml)

輸出:

進階技巧:直接處理檔案

如果您想直接讀取硬碟中的 document.xml.rels 並另存為格式化後的新檔,
可以使用 ElementTree 物件的操作方式:

from lxml import etree

input_file = 'document.xml.rels'
output_file = 'document_pretty.xml'

# 讀取檔案 (同樣建議移除既有的空白以免干擾排版)
parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse(input_file, parser)

# 寫入新檔並開啟 pretty_print
tree.write(
    output_file, 
    pretty_print=True, 
    encoding='utf-8', 
    xml_declaration=True
)

print(f"轉換完成!請查看 {output_file}")

輸出:

為什麼有時候 pretty_print 會失效?

很多新手會發現設了 True 卻沒反應。
這通常是因為原始 XML 中夾雜了原本的「換行符」或「空白」。
lxml 會認為這些空白是文字內容的一部分,因此不敢隨意更動縮排。

解決方案
如範例所示,在解析時加上 parser = etree.XMLParser(remove_blank_text=True)
告訴解析器:「忽略那些無意義的空白,全部由我重新排版!」

總結

  • 手動查看:使用 VS Code (Shift+Alt+F) 最快。
  • 程式處理:使用 Python lxml 搭配 pretty_print=True

掌握這個技巧,無論是在 Debug 還是生成報表,
您的 XML 檔案都能保持專業且整潔的結構。

推薦hahow線上學習python: https://igrape.net/30afN

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡

Recent Posts