XML 格式化

用 2 空格、4 空格或製表符美化 XML,或壓縮成單行。輸入時即時校驗是否格式良好,並顯示元素數量與巢狀深度。

把一整牆 XML 變得能讀,或者再壓回去。 貼上 XML 即可按你偏好的縮排重新排版,也可以壓縮成單行。輸入時會即時校驗是否格式良好,計數器則告訴你文件裡有多少元素、嵌套了多深。

格式化 XML 而不弄壞它

XML 裡的空白屬於內容

這正是 XML 格式化與 JSON 格式化的分水嶺。在 JSON 中,詞法單元之間的空白沒有含義,刪掉永遠安全。而在 XML 中,<name>Ada 之間的字元屬於該元素文本節點的一部分。重新縮排一份文件,技術上就是改變了它的內容。

實際上這幾乎從不構成問題,因為絕大多數 XML 使用的是「純元素內容」——元素裡只包含其他元素,別無他物——這種情況下週圍的空白對任何 schema 都是可忽略的。格式化只在這類元素內部新增縮排。當某個元素裝的是真正的文本,或者像 HTML 那樣文本與子元素混排時,它的內容會被原樣保留。就是這一條規則,讓 <p>Hello <b>there</b></p> 不會在 there 兩邊悄悄多出空格。

格式良好不等於有效

這裡做的檢查是「格式良好」,也就是 XML 規範要求每個解析器都必須執行的那一層:有且僅有一個根元素、所有標籤都閉合且正確巢狀、屬性值加引號、文本中的 &< 已轉義。任何一條不滿足,文件就會被直接拒絕——和 HTML 不同,XML 出了名地沒有容錯恢復。

「有效」則是更進一步的要求:它追問文件是否符合某份 DTD、XSD 或 RelaxNG schema,從而確保 <invoice> 裡確實有 <total>、日期確實是日期。這需要 schema 本身,而它並不在你貼上進來的文件裡。這裡顯示通過,意味著語法沒問題、任何解析器都能讀;但並不意味著接收方系統會認為內容是對的。

壓縮與自閉合標籤

壓縮會移除元素之間可忽略的空白,把整份文件放到一行。由於這些空白本來就不是內容,純元素結構的輸出解析出來的樹完全相同。

另一部分節省來自空元素:<summary></summary><summary/> 被規範定義為等價,輸出時採用較短的寫法。收益真實但有限——XML 的體積大頭花在重複的標籤名上,因為每個元素都要把名字寫兩遍。如果檔案真的需要變小,答案是 gzip,它處理這些重複名字的效果遠勝於任何空白刪除。另外記得留一份格式化的副本用來閱讀,壓縮後的 XML 對人來說基本不可讀。

開源說明:使用原生 JavaScript 實現,不依賴第三方庫。

常見問題

我的 XML 會被上傳嗎?
不會。文件使用瀏覽器內建的 DOMParser 在本地解析和序列化,不會向任何伺服器傳送資料。
格式化會改變我的文件嗎?
只會在那些只包含子元素的元素內部新增空白,這類空白可忽略。裝有文本或混合內容的元素會被原樣保留。
這個工具會按 schema 校驗嗎?
不會。它檢查的是格式良好:標籤閉合且正確巢狀、只有一個根、字元已轉義。按 DTD 或 XSD 校驗需要 schema 檔案本身。
為什麼我的文件被拒絕了?
常見原因是標籤未閉合或不匹配、未轉義的 & 或 <、屬性值沒加引號,以及存在多個根元素。XML 沒有容錯恢復機制。
元素數和深度分別是什麼意思?
元素數是文件中元素節點的總數。深度是最長的一條巢狀鏈的層數,根元素算作第一層。
為什麼我的空標籤變形了?
XML 規範規定 <a></a> 與 <a/> 完全等價,因此壓縮輸出會採用更短的自閉合寫法來節省位元組。