格式化 XML

驗證 和格式化 XML。 語法高亮。永遠免費。
輸入 XML
格式化的 XML
輸入 XML

私密與安全

一切都在您的瀏覽器中進行。您的檔案絕不接觸我們的伺服器。

極速

無需上傳,無需等待。在您拖放檔案的瞬間即可轉換。

完全免費

無需帳戶。無隱藏費用。無檔案大小限制花招。

XML(可擴展標記語言)已經存在了 25 年多,但它仍然深深嵌入現代軟體的基礎設施中:從 Office 文件與 Android 版面配置到 SOAP API、RSS 訂閱來源、設定檔和數位保存工作流程。它不再是寵兒——那個桂冠已經屬於 JSON——但 XML 在需要嚴格結構、豐富中繼資料和長期互通性的地方仍然至關重要。本文的目標是全面解釋 XML:它的來源、運作方式、我們如何處理和驗證它、它與更新格式的比較,以及如何在 2025 年及以後安全有效地使用它。

1. XML 實際上是什麼

XML 是一種簡化的標記語言,用於使用巢狀元素和屬性來表示結構化資料和文件。它由全球資訊網協會的 可擴展標記語言 (XML) 1.0 建議 定義,該建議規定了格式良好的 XML 文件的語法,並描述了處理器應如何處理它們。

XML 規範將 XML 描述為 SGML(標準通用標記語言)的受限子集,旨在更易於實作,同時保留 SGML 的核心能力:使用明確標記表示結構化文字。

一些關鍵特性使 XML 與眾不同:

  • 基於文字且支援 Unicode。 XML 文件是純文字,依賴於 Unicode/ISO 10646 字元集,這使得它們具有可攜性和語言獨立性。
  • 自我描述。 標籤名稱和屬性帶有意義。不需要單獨的架構即可基本理解結構(儘管架構使其功能更強大)。
  • 階層結構。 XML 的樹狀結構直接對應到巢狀資料、文件和設定階層結構。
  • 可擴展。 您可以發明自己的標籤和詞彙表;XML 本身不固定允許的元素集合。

2. 簡史:從 SGML 到 XML 再到現代網路

XML 的根源在於 SGML,這是 20 世紀 80 年代的 ISO 標準,在出版和技術文件中大量使用。到了 20 世紀 90 年代中期,網路的 HTML(本身基於 SGML)無處不在,但過於局限且與呈現緊密耦合。

大約在 1996–1997 年,一個包括 Jon Bosak、Tim Bray、C. M. Sperberg-McQueen、James Clark 等人的工作組開始設計一個更簡單、適合網路的 SGML 子集,可以輕鬆可靠地解析。第一個 XML 1.0 建議於 1998 年發布,XML 迅速成為許多早期網路標準和協定的基礎,包括 SOAP、WSDL、SVG、XSLT 和眾多特定行業的詞彙表。

後來,XML 1.1 改進了一些字元處理和控制字元的邊緣情況,但 XML 1.0 在實務中仍然是主要變體。

3. 核心 XML 語法:格式良好的文件

XML 1.0 規範為格式良好的文件定義了精確的語法。至少,格式良好的 XML 文件:

  • 恰好有一個根元素。
  • 使用匹配的開始和結束標籤。
  • 正確巢狀元素(沒有重疊標籤)。
  • 使用帶引號的屬性值。
  • 使用合法字元和編碼。

一個微小但有效的文件可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<note>
  <to>George</to>
  <from>Adam</from>
  <message>Hello XML!</message>
</note>

XML 宣告是可選的,但它是宣告版本和字元編碼的常規方式。文件元素 <note> 是唯一的根。文字節點、元素、屬性、註解、處理指令和實體參照共同構成規範中描述的樹狀結構。

XML 還區分 格式良好的有效的文件:

  • 格式良好的文件遵循語法規則。
  • 有效的文件另外符合限制其結構和內容的 DTD 或架構。

4. 命名空間:安全地混合詞彙表

隨著 XML 詞彙表的增多,名稱衝突成為一個問題:一個詞彙表可能使用 <title> 表示書名;另一個表示職位頭銜。為了避免衝突,XML 引入了 命名空間,在 W3C 建議 XML 中的命名空間 中定義。

例如:

<book xmlns:dc="http://purl.org/dc/elements/1.1/">
  <dc:title>XML in Depth</dc:title>
</book>

在這裡,dc:title 透過將 dc 前綴繫結到都柏林核心命名空間 URI,可以安全地與任何其他 <title> 元素區分開來。命名空間在現代 XML 生態系統中至關重要:XSD、XSLT、SOAP、RSS 和 Office Open XML 都嚴重依賴它們。

5. 驗證:DTD、XML Schema 等

5.1 DTD

原始 XML 規範包括 文件類型定義 (DTD) 作為定義文件允許結構的規範方法——允許的元素、屬性、實體等。DTD 緊湊且很好地整合到 XML 序言中,但它們有局限性:使用非 XML 語法,類型化較弱,並且難以處理命名空間。

5.2 XML Schema (XSD)

為了解決 DTD 的限制,W3C 在 XML Schema Definition Language (XSD) 1.1 Part 1: Structures 中標準化了 XML Schema Definition (XSD),現在版本為 1.1。XSD 本身用 XML 編寫,支援命名空間,並提供豐富的類型化(字串、數字、日期、清單、聯合)、出現約束和複雜的內容模型。

存在其他架構語言——如 RELAX NG 和 Schematron——但 XSD 在許多企業和標準驅動的環境中仍然是事實上的標準。

5.3 為什麼驗證很重要

驗證將 XML 從結構化文字轉換為系統之間的 合約。例如:

  • 金融訊息傳遞規範為支付指令定義嚴格的架構。
  • Office Open XML 和 RSS 等標準使用架構形式化其文件格式。
  • 建置和設定工具驗證 pom.xmlweb.config 等檔案以儘早發現錯誤。

6. 處理 XML:DOM、SAX 和串流處理

XML 本身只是文字。要做任何有用的事情,軟體必須將其解析為某種模型。兩種經典的處理模型是 DOMSAX

6.1 DOM:記憶體中的樹

W3C 的 DOM Level 3 Core 規範 定義了一個語言中性的物件模型,表示整個文件樹,包含元素、屬性、文字、註解等的節點。DOM 對隨機存取友好,易於推理,並在程式庫中得到廣泛支援,但它需要將整個文件保存在記憶體中。

6.2 SAX:事件驅動的串流處理

Simple API for XML (SAX) 是一個事件驅動的 API,將 XML 作為串流解析,並為諸如 "開始元素"或 "結束元素"等事件觸發回呼。它在 SAX 專案網站 Oracle SAX 教學課程 中描述。

SAX 在單次遍歷中處理文件,而不儲存整個樹,這使得它在記憶體方面極其高效,非常適合大型串流,如日誌、訊息處理或批次轉換。基於拉取的串流 API(如 StAX)遵循類似的原則。

7. XPath、XSLT 和 XQuery:查詢和轉換 XML

7.1 XPath

XPath 是一種緊湊的查詢語言,用於使用類似路徑的運算式(如 /bookstore/book[1]/title)來定址 XML 文件的各個部分。最新版本在 XPath 3.1 中定義,擴展了模型以透過對應和陣列處理 JSON 資料,並得到大量標準函式的支援。

XPath 嵌入在許多工具中:XSLT、XQuery、XML Schema 斷言以及流行程式設計語言中的 API。

7.2 XSLT

XSL Transformations (XSLT) 是一種宣告性語言,用於將 XML 轉換為其他格式——XML、HTML、文字,甚至在現代處理器中轉換為 JSON。W3C 的 XSLT 3.0 建議 定義了一個基於範本的系統,依賴 XPath 進行模式匹配和選擇。

樣式表本身是使用 XSLT 命名空間的 XML 文件。XSLT 3.0 為大型文件添加了串流處理功能,並改進了與 JSON 和對應的整合。

7.3 XQuery

XQuery 是用於 XML 儲存庫的完整查詢語言,在 XQuery 3.1 中定義。它設計用於查詢和轉換 XML 資料集合,通常儲存在原生 XML 資料庫或文件儲存中,並使用 FLWOR 運算式(forlet whereorder byreturn)產生強大的結果集。

XPath、XSLT 和 XQuery 共同構成了一個豐富的工具包,用於大規模處理 XML,特別是在出版、數位人文、電子政務和資料整合環境中。

8. XML 在當今的實際用途

即使 JSON 主導了 Web API,XML 仍然深深嵌入許多系統和標準中。

8.1 文件格式和標準

  • Office Open XML (OOXML)。 現代 Microsoft Office 文件(.docx.xlsx.pptx)是由 ECMA-376 Office Open XML 和相關 ISO 標準定義的 XML 檔案的 ZIP 套件。
  • 數位保存。 國會圖書館等機構將 XML(特別是 XML 1.0)視為表示結構化數位內容的穩定、有利於保存的格式。
  • 學術和技術標記。 TEI、DocBook 和其他特定領域的詞彙表基於 XML,支援語義標記和長期歸檔。

8.2 訊息傳遞和 Web 服務

  • SOAP。 W3C 的 SOAP 1.2 規範定義了基於 XML 的信封,用於透過 HTTP 等協定交換結構化訊息。
  • RSS 和聯合。 RSS 2.0 規範 定義了用於訂閱來源聯合的 XML 格式,仍廣泛用於部落格、新聞和產品訂閱來源。

8.3 設定和建置系統

  • Maven POM。 Apache Maven 的專案物件模型(pom.xml)是一個 XML 檔案,描述專案中繼資料、相依項、外掛程式和建置設定,在 POM 參考 POM 簡介 中記錄。
  • Spring Framework XML 設定。 傳統的 Spring 應用程式通常在 applicationContext.xmlbeans.xml 檔案中定義 bean 和連接,這種方法仍在 Spring 參考文件 Java Guides 等教學課程中描述。
  • .NET 設定。 ASP.NET 和 WCF 依賴格式化為 XML 的 web.configapp.config 檔案來設定端點、繫結和行為,如 Microsoft 的 web.config 文件 WCF 設定指南 中所述。

更一般地說,當驗證和工具很重要時,XML 仍然是常見的設定格式,特別是對於由 XSD 支援的架構。

8.4 行動和 UI 版面配置

在 Android 中,UI 版面配置通常在 res/layout 下的 XML 檔案中宣告。Google 的文件解釋說,您使用 Android 的 XML 詞彙表編寫版面配置,以巢狀檢視,非常類似於 HTML,每個版面配置檔案包含一個根元素。

9. XML vs JSON vs YAML

到 2025 年,JSON 顯然贏得了 Web API 的受歡迎程度競賽:最近的一篇比較文章估計 JSON 約佔 Web API 回應的 87%,XML 佔 9%,YAML 佔 4%。

9.1 XML 的優勢

與 JSON 和 YAML 相比,XML 在您需要以下內容時表現出色:

  • 豐富的架構和強大的驗證。 XSD 允許您指定複雜類型、約束和關係,並擁有成熟的工具和驗證器生態系統。
  • 混合內容和文件。 XML 是為文字豐富的文件而構建的,其中標記和文字交錯;JSON 和 YAML 更適合純結構化資料。
  • 深度中繼資料和可擴展性。 命名空間和架構允許版本容錯文件,可以在不破壞較舊使用者的情況下添加可選元素和屬性。

9.2 JSON 和 YAML 的優勢

JSON 更易於讀寫,自然地對應到 JavaScript 物件,並且在傳輸中更小。教學課程經常指出,JSON 省略結束標籤,更簡潔,並且可以在瀏覽器中本地解析,而無需專用的 XML 解析器。

YAML 強調設定的人類可讀性,在 Kubernetes 和 Ansible 等 DevOps 工具中很受歡迎,儘管其複雜性和對縮排的敏感性可能會引入錯誤。

9.3 選擇正確的格式

現代指南傾向於:

  • 對於大多數 Web API 和用戶端-伺服器通訊,使用 JSON
  • 在雲端/DevOps 環境中,對於以開發人員為中心的設定,使用 YAML
  • 當您需要基於架構的文件、混合內容、現有 XML 生態系統(SOAP、OOXML、WCF、Android 版面配置)或標準化和工具成熟的長期歸檔時,使用 XML

10. 安全性:XXE 和其他 XML 陷阱

XML 的靈活性伴隨著尖銳的邊緣,特別是在外部實體和 DTD 方面。OWASP 的 XML External Entity (XXE) 預防備忘單 記錄了 XXE 漏洞如何允許攻擊者讀取本地檔案、執行伺服器端請求偽造,或透過利用實體擴展導致拒絕服務。

常見的攻擊向量包括:

  • 參照本地或遠端資源的外部實體。
  • DTD 中擴展為巨大有效負載的參數實體。
  • 透過不受信任的網路檢索 DTD。

緩解指南通常建議:

  • 盡可能在解析器中停用 DTD 和外部實體。
  • 使用硬化的解析器設定或遵循 OWASP 建議的安全程式庫。
  • 針對架構進行驗證,而不啟用有風險的功能。

其他安全考慮包括超大文件(資源耗盡)、從使用者輸入建置查詢的系統中 XPath/XQuery 注入,以及設定錯誤的基於 XML 的設定檔導致權限提升或程式碼執行。

11. XML 的設計和最佳實務

如果使用得當,XML 仍然是建模資料和文件的乾淨、穩健的方法。一些實用指南:

  • 建模清晰的樹。 圍繞穩定的概念樹(例如,<invoice> <lineItems><lineItem>)設計您的 XML,而不是直接反映關聯式架構。
  • 有意選擇元素與屬性。 對主要內容和結構使用元素;對中繼資料和標誌使用屬性。
  • 從一開始就使用命名空間。 即使對於小型詞彙表,分配命名空間(例如, xmlns="https://example.com/ns/invoice")也可以避免以後痛苦的遷移。
  • 用架構支援您的格式。 提供 XSD(或其他架構語言)並將其視為公共合約的一部分。在 CI 和整合點使用架構驗證。
  • 保持人類可檢查。 漂亮的列印和註解有助於偵錯、設定和長期維護。
  • 將資料與呈現分離。 使用 XML 表示結構和意義,並使用 XSLT 或其他工具將其轉換為 HTML、PDF 或其他格式。
  • 選擇適當的處理模型。 對於中小型文件和複雜查詢,DOM + XPath/XSLT 可能是理想的;對於非常大的串流或受限環境,使用 SAX、StAX 或事件驅動的處理。
  • 強化解析器。 在解析不受信任的輸入時,遵循 OWASP XXE 預防指南和您語言的安全最佳實務。

12. XML 的未來作用

在日常 Web 開發中,XML 在很大程度上已將中心舞台讓給了 JSON 和 YAML。但在許多領域——企業整合、文件標準、設定管理、數位保存和遺留系統——將所有內容重寫為更新格式要麼不可行,要麼不可取。

W3C 和 Ecma 等標準機構仍然維護基於 XML 的規範,如 XML 1.x、XML Schema、XPath、XSLT、XQuery、SOAP 和 OOXML,國會圖書館等機構繼續將 XML 視為歸檔的主力。

對於開發人員來說,這意味著每當您接觸 Office 檔案、Android 版面配置、許多 Java 企業堆疊、.NET 設定、較舊的 SOAP/WSDL 服務或標準驅動的資料交換時,您都可能與 XML 互動。理解 XML 的語法、命名空間、架構和處理模型仍然是一項寶貴的技能,特別是如果您在整合、基礎設施或長期系統中工作。

XML 可能不再是現代 Web API 的明星,但它仍然是大量軟體的堅實、規範良好且工具豐富的基礎。深入學習它,每當您需要強大的架構、豐富的文件或瀏覽現有基於 XML 標準的廣闊領域時,都會得到回報。

常見問題

什麼是 XML?

XML(可擴展標記語言)是一種標記語言,定義了以人類和機器可讀格式編碼文件的規則。

為什麼需要格式化 XML?

格式化 XML 透過新增適當的縮排和換行使其易於人類閱讀。這在處理縮小的 XML 或偵錯時特別有用。

XML 驗證做什麼?

XML 驗證檢查您的 XML 文件是否格式良好(語法正確),並可選擇是否符合架構。

我的 XML 資料安全嗎?

是的!所有 XML 格式化和驗證都在您的瀏覽器中完成。您的資料永遠不會離開您的電腦。

我可以上傳 XML 檔案嗎?

是的,您可以使用「開啟檔案」按鈕上傳 XML 檔案。

常見的 XML 錯誤有哪些?

常見的 XML 錯誤包括:未閉合的標籤、不匹配的開始和結束標籤、無效字元。

我可以複製格式化的 XML 嗎?

是的,使用「複製」按鈕將格式化的 XML 複製到剪貼簿。