將 XML 資料格式化意味著重建文件的視覺縮排,讓每一個開始標籤與結束標籤都位於符合其在樹狀結構中真實位置的縮排深度。一個格式良好的 XML 檔案能讓巢狀結構一目了然——子元素清楚地縮排在父元素之下、屬性對齊,且整份文件能像大綱一樣從上到下閱讀。未經格式化的文件通常是一整行,或是縮排已不再對應真實結構的區塊,無論是哪一種,手動閱讀或編輯都既繁瑣又容易出錯。這項工作純粹是機械性的:計算開始標籤、計算結束標籤、將它們對齊到正確的深度,並保留標籤之間的所有內容。這個描述更符合工具驅動的工作,而非人工處理,這也就是 XML 格式化幾乎總是委派給理解該語言的整理工具 (beautifier) 的原因。

Notepad++ 是存放 XML 檔案的熱門位置,因為它能為標籤、屬性和文字內容上色,但編輯器本身出貨時並未內建 XML 整理工具。Notepad++ 開箱即用只能使用通用的空白字元規則重新縮排文字——它無法理解屬性值中包含的 > 字元其實仍在標籤內、CDATA 區段應該原封不動地通過,或是自行關閉元素不應被填充額外的空白字元。傳統的解決方法是安裝第三方外掛,例如 XML Tools,這需要下載檔案、將它們放到正確的外掛資料夾,然後重新啟動編輯器。

更快的做法是將 XML 從 Notepad++ 複製出來,貼到瀏覽器型的 XML 格式化工具 中,選擇縮排風格,然後將清理後的結果複製回去。整個來回過程只需一瞬間,而且因為該工具在您的瀏覽器中使用 JavaScript 在本地端執行,所以不會上傳任何內容。本文的其餘部分將逐步說明該如何執行、格式化工具會保留哪些內容,以及何時該使用壓縮 (Minify) 而非格式化 (Format)。

how to format xml data in notepad++
在 Notepad++ 中格式化 XML 資料,無需外掛

為何 XML 資料最終變得難以閱讀

大多數凌亂的 XML 來自以下三個地方之一。SOAP 和 REST 服務的 API 回應通常會以壓縮成單一行的方式傳送,以節省頻寬——標籤之間的每個空白位元組在傳輸前都會被剝除。像 pom.xml、AndroidManifest.xml、ASP.NET web.config 和 Spring beans 這類組態檔,則常由建置工具自動產生,並繼承工具所決定的縮排風格。人為編輯也會留下痕跡:開發人員在 Notepad++ 中開啟檔案、手動刪除一個標籤,導致周圍的縮排不再反映真實的巢狀結構。

無論來源為何,結果都一樣——一份肉眼難以追蹤哪個結束標籤對應到哪個開始標籤、且尋找特定元素等於在字元海中搜尋的文件。格式化工具會重建視覺階層,讓結構再次變得顯而易見,一個元素接著一個元素,一行接著一行。

五個步驟在瀏覽器中格式化 XML

從 Notepad++ 清理 XML 資料最快的方式,就是使用瀏覽器型的 XML 格式化工具。以下是完整的工作流程。

  1. 將您的 XML 貼上或在輸入框中輸入。在瀏覽器中開啟 XML 格式化工具,選取您 Notepad++ 文件中的所有文字 (Windows 上的 Ctrl+A 或 macOS 上的 Cmd+A),複製它 (Ctrl+C / Cmd+C),然後貼到輸入區域。您也可以直接貼上來自 API 回應或組態檔的 XML。
  2. 選擇縮排風格。選擇每個巢狀層級使用 2 個空格、4 個空格或一個 Tab。配合您專案使用的風格,讓格式化後的輸出可以直接放回檔案中,而不會產生雜亂的差異 (diff)。
  3. 點擊 Format 進行美化排版,或點擊 Minify 壓縮成一行。Format 會以一致的縮排重建視覺階層。Minify 則會去除標籤之間的空白,產生單一緊湊的一行——適用於在傳送前縮減酬載大小。
  4. 檢視結果並讀取任何錯誤訊息。如果 XML 不正確,格式化工具會標記結構問題,例如未關閉的標籤、不匹配的結束標籤,或未終止的註解和 CDATA 區段,通常會附上行號和欄號。請在您的 Notepad++ 來源中修正問題,然後將修正後的版本重新貼回。
  5. 點擊 Copy 將結果放到剪貼簿。將其貼回 Notepad++ 中原本的區塊位置。儲存檔案後,您的 XML 現在就是乾淨縮排的狀態了。

選擇 2 個空格、4 個空格或 Tab

縮排的選擇並非只是美觀——它會影響格式化後的檔案在版本控制中的呈現方式、與相鄰程式碼的對齊情形,以及最深層標籤佔據多少欄位。

  • 2 個空格是許多現代專案的預設值,能讓寬度較大的文件保持窄幅。它也是 Google XML 風格指南所使用的慣例。
  • 4 個空格是 Java、Spring 和 .NET 組態長期以來的預設值,並為每個巢狀層級提供更強烈的視覺提示。
  • Tab符合大多數編輯器原生產生的內容,並讓每位開發人員透過編輯器的 Tab 停駐點設定自行選擇視覺寬度。

猶豫不決時,就配合檔案中其餘部分已在使用的風格。一致的縮排比混用風格更容易閱讀,且在檔案提交時能產生更小的差異。

XML 格式化工具會保留哪些內容

XML 有幾個結構會讓天真的「尋找取代」整理工具處理錯誤。這個格式化工具圍繞著 XML 的標籤與屬性模型建構,並能正確處理所有這些情況。

  • 包含 > 的屬性值會被解析為屬性的一部分,而不會被誤讀為標籤的結尾。
  • 像 <br/> 這樣的自行關閉元素會保持原樣不動。
  • 註解 (<!-- ... -->) 會留在原位,並與周圍的元素一起縮排。
  • CDATA 區段會原封不動地通過,因此其中的字面字元——包括保留符號和看起來像標記的文字——無論格式化或壓縮都能存活下來。
  • XML 宣告 (<?xml version="1.0"?>) 和處理指示會保持在文件頂部的獨立一行。
  • DOCTYPE 宣告會逐字保留。
  • 混合內容——也就是在 SVG 文字、XHTML 或文件格式中會看到的、文字與行內子元素混合的元素——會保持單行原樣,因此其內部任何有意義的空白都不會被重寫。

有一點要知道:格式化工具只會重新縮排標籤之間的空白。它唯一會正規化的空白,是其內容僅為純文字的元素的開頭和結尾空白。若您的文件依賴 xml:space="preserve",請改用 Minify,它會將所有有意義的文字完全保留原樣。

Format 與 Minify:何時該使用哪一個

Format 和 Minify 做相反的事情,解決不同的問題。下表比較了這兩個方向。

面向Format (美化排版)Minify
輸出形狀多行、縮排的文件單一緊湊的一行
縮排2 個空格、4 個空格或 Tab標籤之間無空白
註解保留並縮排保留在原位
CDATA原封不動地通過原封不動地通過
混合內容逐字輸出於一行逐字輸出於一行
最適用於閱讀、編輯、檢閱差異透過網路傳送、嵌入程式碼中、縮減酬載大小

選擇取決於您接下來要對 XML 做什麼。如果您即將閱讀或編輯它,請用 Format。如果您即將傳輸或嵌入它,請用 Minify。許多開發人員會保留一份格式化版本用於編輯,另保留一份壓縮版本用於發布。

瀏覽器型格式化 vs 安裝外掛

在 Notepad++ 中傳統的做法是安裝 XML Tools 外掛,並使用其 Pretty Print 快捷鍵。這能運作,但與瀏覽器型方式相比有一些權衡。

面向瀏覽器型 XML 格式化工具Notepad++ XML Tools 外掛
安裝無——開啟頁面即可下載 DLL,放置於外掛資料夾,重新啟動
執行位置瀏覽器,使用本地端 JavaScript在 Notepad++ 處理程序內部
網路存取首次載入後不需要不需要
隱私XML 不會離開裝置XML 保留在裝置上
錯誤回報常見結構問題附上行號和欄號常見結構問題附上行號和欄號
縮排選項2 個空格、4 個空格、Tab可在外掛設定中配置
在 Notepad++ 中可直接編輯否——需貼回是——會原地套用

對於經常格式化 XML 的 Notepad++ 使用者來說,外掛在便利性上勝出,因為格式化會原地進行。對於偶爾格式化的需求,瀏覽器工具則完全免除了安裝步驟。兩者最終都會達到相同的結果——乾淨縮排的 XML。如果您也在 Notepad++ 中處理 HTML 檔案,在 Notepad++ 中格式化 HTML 程式碼,無需外掛 這篇文章描述了相同的瀏覽器型做法。

識別並修正格式化工具所捕捉的錯誤

由於格式化工具在格式化時會剖析您的文件,因此它能標記出那些在真實 XML 檔案中造成最多困擾的錯誤。以下是您最可能遇到的錯誤,以及它們在 Notepad++ 編輯工作階段中通常代表的意義。

  • 未關閉的標籤。一個開始標籤沒有對應的結束標籤。通常是因為在 Notepad++ 中刪除一行時,沒有檢查後續內容。
  • 不匹配或錯置的結束標籤。一個結束標籤沒有對應的開始標籤,或是關閉了錯誤的元素。幾乎總是在檔案間複製貼上時發生的錯誤。
  • 未終止的註解。<!-- 缺少對應的 -->。發生在文字被外部工具從註解中間截斷時。
  • 未終止的 CDATA 區段。<![CDATA[ 缺少對應的 ]]>。常見於大量經過跳脫處理的資料區塊在檔案之間移動時。
  • 未終止的處理指示。<? 缺少對應的 ?>。會影響 XML 宣告及文件頂部類似的結構。

格式化工具並非完整的 XSD 或 DTD 驗證器——它不會根據結構描述 (schema) 檢查您的文件、不會驗證資料型別,也不會強制執行命名空間規則。請將它視為一個會拒絕悄悄輸出損壞結果的工具,而非合規性檢查器。對於在重新格式化過程中捕捉到的結構問題,它會提供一則友善的訊息,並盡可能附上行號和欄號,讓您能跳回 Notepad++ 的來源中檢視。

如果您正在權衡各種選項,將 XML 轉換為 CSV 而不遺失重複欄位 這篇文章對此有詳細說明。