第一次 XML 幾乎毀了我的下午,這是來自支付網關的 SOAP 回應。一行。一萬個字元。沒有換行符,沒有縮進,只有一堵完整的尖括號牆,我的終端包裹在一塊無法讀取的磚塊中。在某個地方,有一個錯誤的元素導致了簽名不匹配,我應該透過眼睛找到它。從那時起,我已經建立了很多東西 - WordPress 插件、Laravel API、[toolz。dev] 背後的 React 工具(/- 我可以告訴你,一個好的 XML 格式化程式是那些安靜的實用程式之一,直到你盯著一堵標籤牆,最後期限已經過去了。
這本指南是我那天下午希望得到的。它涵蓋了 XML 格式化程式的實際功能、為什麼美化和縮小是同一枚硬幣的兩面、使格式安全的空白規則,以及幾乎佔每個 " 的少數驗證錯誤;為什麼獲勝'這個解析和引用;時刻。您可以在瀏覽器中免費跟上 XML 格式化程式 - 它完全在您的機器上運行,因此即使是支付有效負載也永遠不會離開您的筆記型電腦。
TL;DR: XML 格式化程式重寫文件'微不足道的空白 - 空間 之間 標籤 - 不觸及其意義。美化增加了換行符和縮進,以便您可以讀取層次結構;縮小所有條帶,使檔案盡可能小。良好的格式化程式會保留註解、CDATA、XML 聲明和屬性順序,並沿途驗證格式良好(匹配標籤、關閉元素、終止部分)。它確實如此 不是 根據 DTD 或 XSD 模式檢查您的文件 - 這是不同的工作。
XML 格式化程式實際上有什麼作用?
空白是格式變得有趣的地方,因為 XML 1.0 需要解析器將元素內的每個字元傳遞到應用程式 - 這就是為什麼格式化程式必須知道可以安全觸摸什麼。 XML 格式化程式的核心是將您的文件解析為節點樹(元素、文字、註解、CDATA 部分、處理指令),然後以一致的間距序列化該樹。往返就是整個技巧。因為該工具了解結構而不是進行盲查和替換,因此它可以縮排深度嵌套的結構 <order><items><item> 正確連結,將每個兄弟姊妹放在自己的行上,並知道裡面的文字 <price>44.95</price> 應該與標籤保持在同一行,而不是分散在三個標籤上。
這很重要,原因在於 XML 規範中隱藏的規則:元素之間的大部分空格是 微不足道。 當解析器讀取時 <a>\n <b/>\n</a>,周圍的換行符和空格 <b/> 是否適合人類且不攜帶任何資料。格式化程式可以自由新增、刪除或變更該空白。它永遠不能觸及的是 重要的 空白 - 文字節點內的字元類似 <note>Call me at 9am</note>,或 CDATA 區塊內的任何內容 - 因為該內容是真實資料。每個格式決定 XML 格式化程式 透過尊重這條線來流動。
所以美化並不是裝飾性的絨毛。當你重新縮排那塊一萬一千個字元的肥皂磚時,元素層次結構就會變得可見,並且突然出現錯位 <Amount> 節點三級太深是顯而易見的。格式化既是一種可讀性工具,也是一種調試工具。
為什麼我要縮小 XML 而不是美化它?
美化和縮小是同一台指向相反方向的引擎。 Beautify 為人類添加了空白; minify 為機器刪除它。當大小或傳輸很重要時,您可以進行縮小:縮小行動應用程式包內附帶的設定文件,在請求正文經過緩慢連接之前對其進行修剪,或者標準化文檔,以便可以逐字比較兩個版本,而無需縮排噪音妨礙。
節省是真實的,但很少是戲劇性的。 XML'冗長的內容在於其重複的標籤名稱,而不是其空白,因此縮小通常會在百分之五到百分之二十之間,具體取決於原始標籤的縮排程度。這是值得擁有的,但如果您需要嚴重的壓縮,線上的 gzip 會做得更多 - 縮小然後 gzipping 是許多 API 使用的皮帶和支架方法。
這是我在決定使用哪種方式來指向工具時使用的心理模型:
| 情況 | 美化 | 縮小 |
|---|---|---|
| 透過眼睛閱讀或調試回應 | 是的 | 不 |
| 將設定檔提交到版本控制 | 是的(乾淨的差異) | 不 |
| 在應用程式捆綁包內或透過網路傳送 XML | 不 | 是的 |
| 在資料庫列中儲存許多小文件 | 不 | 是的 |
| 為位元組間差異準備文件 | 要嘛,始終如一 | 要嘛,始終如一 |
| 將 XML 交給其他開發人員 | 是的 | 不 |
關鍵的紀律是一致性。如果您要差異兩個文檔,請執行 兩者 首先透過相同的模式和相同的選項 - 否則您比較的是縮排樣式,而不是內容。
格式化如何避免更改我的資料?
這就是每個格式化程式都必須克服的焦慮:"如果這個工具重寫了我的 XML,我怎麼知道它沒有悄悄地破壞某些東西?"誠實的答案是,精心設計的格式化程式只會改變標籤之間的空白,並且嚴格保留四件事。
第一個是 文字內容。 元素內的字元是逐字複製的。其中包括實體 - 文字 & 留下來 &()它永遠不會被有效地解碼 & (這將產生無效的 XML)或雙重編碼 &amp;. 的 XML 格式化程式 將您的文字視為不透明,這正是您想要的。
第二個是 CDATA 部分. A <![CDATA[ ... ]]> 區塊的存在正是為了讓您可以刪除原始的、未轉義的內容 - JavaScript 的片段、HTML 的區塊、充滿的字串 < 和 & - 進入 XML 文件而不轉義它。格式化程式完全按照它找到的內容發出該內容,無法轉義,無法在區塊內重新縮排。
第三個是 評論和聲明. 評論 (<!-- ... -->), <?xml version="1.0"?> 聲明和任何處理指令都會被保留並明智地放置。當您想要更精簡的文件時,您可以選擇刪除評論,但這是您的決定,而不是工具在背後做的事情。
第四個是 屬性順序和引用。 預設情況下,格式化程式會按照您編寫的順序以及您使用的引用樣式保留您的屬性,因為 XML 規範將屬性順序視為無關緊要,並且沒有理由更改它。當你 做 想要一個規範的順序 - 對於更乾淨的差異,或比較兩個以不同順序攜帶相同屬性的元素 - a "sort 屬性"選項為您按字母順序排列它們。
因為所有這些都在 JavaScript 中運行客戶端,所以還存在隱私紅利:充滿連接字串、內部識別碼或客戶記錄的文件在您自己的電腦上格式化並且從未上傳。如果您關心將工作資料從其他人身上保留下來'伺服器 - 您應該 - 該模型值得理解,我在 中寫了更多相關內容 線上工具的資料隱私指南.
格式化程式會捕獲哪些 XML 錯誤?
在格式化程式可以漂亮地列印任何東西之前,它必須解析文檔,而解析就是進行有用驗證的地方。這是 格式良好 檢查--每個 XML 文件都必須遵守的結構規則--根據我的經驗,三個錯誤導致了絕大多數失敗。
迄今為止最常見的是a 裸&. XML 儲備 & 啟動一個實體,所以原始 & 在文字中 - 潛入 URL 的類型 ?a=1&b=2 或像 " 這樣的公司名稱; Spencer" - 使解析器期望一個實體名稱,然後在找不到實體名稱時阻塞。修復方法是寫入 &,一條好的錯誤訊息會讓你陷入困境,這樣你就不會盲目狩獵。
第二個是a 標籤不匹配或未關閉. 打開a <div> 並關閉它 </section>,或打開a <span> 永遠不要關閉它,而且文檔也不再格式化良好。格式化程式在解析時追蹤開放元素堆疊,因此它可以準確地告訴您它期望看到關閉的標籤以及它實際找到的標籤。那條訊息 - "預期的 </book> 但發現了 </author> 在第 14 行&引用; - 通常足以在幾秒鐘內解決問題。
第三個是a 未終止的部分:評論開頭是 <!-- 那永遠不會達到 -->或永遠達到的 CDATA 區塊 ]]>. 當您手動編輯和刪除太多內容時,這些很容易建立。格式化程式再次報告失控部分開始的行。
格式化程式的作用 不是 是否根據模式檢查您的文件。格式良好的詢問"這是結構上有效的 XML 嗎?"有效性要求"這個 XML 是否遵循規則 我的特別 文件類型 - 正確的元素,正確的順序,具有正確的資料類型 - 由 DTD 或 XSD 定義?&引用;這些是單獨的層。文件可以格式完美,但對於其預期目的來說仍然是無意義的。架構驗證需要架構,這是一個不同的工具。格式化程式保證第一層,即阻止解析器崩潰的層。
如何在編輯器中格式化 XML 或建立管道?
瀏覽器工具是一次性文件的最快路徑,但值得了解替代方案,以便您可以選擇適合該工作的工具。
大多數編輯器本身格式化 XML。在 VS Code 中,內建 "格式化文檔和引用;命令 (Shift+Alt+F) 處理 XML 以及 Red Hat' 等擴充功能; XML 語言伺服器在頂部新增模式感知格式。 IntelliJ 及其兄弟版本重新格式化為 Ctrl+Alt+L。當文件已經在您面前開啟時,這些是理想的選擇。
在命令列上, xmllint --format file.xml (libxml2 的一部分,在大多數 Unix 系統上提供)美化,並且 xmllint --noblanks file.xml 讓您接近最小化輸出。在 Node 專案中,庫喜歡 xml-formatter 或者 prettier 將 XML 外掛程式插槽放入建置步驟。 Python 開發人員伸手去拿 xml.dom.minidom.parseString(s).toprettyxml(),但請注意,它因在現有空白周圍添加額外的空白行而臭名昭著。
那為什麼要使用呢 XML 格式化程式 全部?我不斷回來的三個原因。它不需要安裝、配置和項目 - 你貼上然後去。它將資料保留在您的電腦上,當 XML 是真實的有效負載而不是玩具範例時,這很重要。它自然地與相鄰工具配對:一旦您的 XML 乾淨有效,就將其轉換為 JSON XML 到 JSON 轉換器 一鍵點擊,然後反向行程通過 json 到 xml 使用相同的約定。如果您的一天主要是 JSON,那麼 json 格式化程式 是該格式的等效項,整個系列都被編入目錄中 web 開發人員工具包.
我應該何時格式化與轉換 XML?
我從新認識的人那裡得到的一個問題是:如果 JSON 更容易閱讀,為什麼要格式化 XML 而不是僅僅轉換它?答案是格式化和轉換可以解決不同的問題。
需要時格式化 保持 XML - 因為 SOAP 端點需要它,因為 RSS 或 Atom 提要根據定義是 XML,因為您的設定檔、Android 佈局或 Maven pom.xml 簡單地說是 XML,而且永遠都是。格式化使 XML 可讀或緊湊,同時將其保留為 XML。下游無需更改任何內容。
當您想轉換時進行轉換 以不同的格式處理資料 - 將值拉入 JavaScript 前端,將來源載入到使用 JSON 的系統中,或將多個來源標準化為一種形狀。轉換會改變格式,並隨之改變一些保真度:XML 屬性、混合內容和元素排序沒有乾淨的 JSON 等價物,因此轉換器會做出深思熟慮的選擇(屬性變成前綴鍵,重複標籤變成數組),您應該在依賴它們之前先了解它們。
我的經驗法則:格式第一,永遠。乾淨、經過驗證的文件更容易推理您的下一步是編輯、傳播還是轉換。格式化是一種廉價、安全、無損的操作;一旦您知道結構健全,轉換就是您所做的有損操作。網站地圖是 XML 的一個很好的範例,您可以格式化而不是轉換 - 如果您正在建立 XML,則可以使用專用 XML 網站地圖產生器 直接產生有效、格式良好的輸出。
常見問題
如何在線格式化 XML?
將您的 XML 貼到輸入面板中,選擇 Beautify,選擇縮排寬度,然後按一下格式。 該工具解析文件,重新縮排,並允許您複製或下載結果。 所有處理都在您的瀏覽器中進行 - 沒有上傳。
美化和縮小 XML 有什麼區別?
美化增加了換行符和縮進,因此元素層次結構易於閱讀,非常適合編輯和調試。縮小刪除標籤之間的所有空格以產生盡可能小的文件,這非常適合透過網路儲存或發送。兩者都保留文檔's 意義;僅更改微不足道的空格。
格式會改變我的 XML 的意義嗎?
不 。 只有標籤之間的空格被更改 - 元素、屬性、文字內容、註釋和 cData 沒有變化。 由於文字節點和 CData 內的重要空格被保留,因此格式良好的文件在格式化之前和之後的行為相同。
評論和 CData 部分是否保留?
是的。評論、CDATA 部分、XML 聲明和處理說明均已保留。評論與它們所在的元素一起縮進,並且 CDATA 內容逐字發送,沒有任何轉義。如果您想要更精簡的輸出,您也可以選擇刪除評論。
這個工具可以驗證我的 XML 嗎?
是的。 在格式化之前,文件已完全解析,結構問題 - 未關閉的元素,與其開啟標籤不匹配的關閉標籤,或未終止的評論或 CData 部分 - 以行號報告,因此您可以快速修復它們。 它檢查了良好的格式,而不是針對 DTD 或 XSD 模式的有效性。
為什麼我的 XML 無法格式化?
幾乎所有故障都是格式良好的錯誤。最常見的是文字中的裸&符號(它必須寫成一個實體,或者解析器將其讀取為實體的開頭)、與其關閉的元素不匹配的結束標籤,以及已開啟但從未關閉的元素。錯誤訊息指向該行,因此您可以直接跳到該行。
格式化包含敏感資料的 XML 是否安全?
是的。 解析器在您的瀏覽器中完全以 JavaScript 運行 - 沒有網路請求可以攜帶您的資料,沒有任何東西被記錄或儲存,並且該工具在載入後離線工作。 XML 持有 API 金鑰、連線字串或客戶記錄永遠不會離開您的機器。
之後我可以將格式化的 XML 轉換為 JSON 嗎?
是的。 一旦 XML 乾淨有效,XML 到 JSON 轉換器將其轉換為等效的 JSON,將屬性對應到前綴鍵,將重複標籤對應到陣列。 格式化首先使結構變得明顯,這有助於您在轉換之前了解它將如何映射。
由 Liton 編寫 - toolz。dev、WP Adminify 以及一長串 Laravel 和 React 專案的建構器。這裡提到的每個工具都在您的瀏覽器 [toolz。dev] 中免費且完全運行(/)。



