XML 轉 JSON 工具
什麼是 XML 轉 JSON?
XML 轉 JSON 會把 XML 標記轉成 JSON 結構,讓資料更容易在 JavaScript、API、低程式碼工具或現代資料流程中處理。這種轉換不一定直觀,因為 XML 有元素、屬性、文字節點、命名空間、順序和重複節點,而 JSON 使用物件、陣列和簡單值。這個工具適合舊系統整合、SOAP 回應、網站地圖、RSS、設定檔和測試資料。用於正式介面時,應仔細檢查屬性、空元素、混合內容、命名空間和陣列偵測如何被映射。JSON 能成功解析,不代表所有業務資訊都以預期形狀完整保留下來。
使用方式
使用方式
- 在左側輸入方塊中貼上或輸入 XML 資料
- 選擇縮排大小(2 個空格、4 個空格或 Tab)
- 轉換後的 JSON 會顯示於右側並附語法高亮
- 檢視轉換結果並修正任何 XML 錯誤
- 點選「Copy」或「Download」儲存結果
資料結構說明
- XML 屬性、重複節點、命名空間和混合文字可以多種有效方式對應到 JSON;使用前請先檢查產生的結構。
- 進行 API 移轉時,請定義欄位對應規則,而非僅依賴單一樣本的轉換結果。
使用場景
技術原理
轉換從瀏覽器內建的 XML 解析器開始。`new DOMParser().parseFromString(xmlString, 'application/xml')` 傳回一個遵循 W3C DOM Level 3 Core 的 `Document`,針對 XML 1.0(第五版)驗證格式正確性,並將結果暴露為 `Element`、`Attr`、`Text`、`CDATASection` 和 `Comment` 節點的樹狀結構。若輸入格式錯誤,解析器不會丟出例外——它傳回的文件根元素為 `<parsererror>`,其中包含位置和原因,因此轉換器會先檢查 `doc.querySelector('parsererror')` 並顯示該訊息,而非產出不完整的 JSON。 樹到 JSON 的映射以深度優先方式遍歷文件,遵循 Badgerfish 風格慣例。每個元素成為一個屬性,鍵名為本地名稱;子元素成為巢狀物件;元素屬性以 `@` 前綴展平(例如 `<user id="7">` → `{ "user": { "@id": "7" } }`);與子元素並存的文字內容儲存在 `#text` 下。具有相同名稱的重複兄弟元素折疊為 JSON 陣列:兩個 `<item>` 節點成為 `"item": [ ... ]`,但單一 `<item>` 保持為純物件——這就是眾所周知的「單一與多數」歧義,因為 XML 無法區分單元素列表和純量值,而 JSON 將 `"item": {...}` 和 `"item": [{...}]` 視為不同的形狀。 若干 XML 特性沒有乾淨的 JSON 等效形式,因此是有意的有損轉換。元素順序在 XML 中被保留,但 JSON 物件的鍵順序在所有消費者中不被保證(雖然 ES2015 指定了字串鍵的插入順序,但 JSON Schema 等綱要並不限制它)。混合內容如 `<p>Hello <b>world</b>!</p>` 將文字與元素交織,無法往返轉換為簡單的鍵值模型。Clark 表示法中的 XML 命名空間(`{http://example.com/ns}user`)被簡化為本地名稱 `user`,可能與另一個無關的同名元素衝突。CDATA 區塊如 `<![CDATA[<raw>]]>` 被展開為純文字。處理指令(`<?xml-stylesheet ...?>`)、註釋(`<!-- ... -->`)和 XML 宣告被丟棄,因為 JSON 沒有相應的語法。縮排透過 `JSON.stringify(value, null, indent)` 搭配 2 空格、4 空格或 `'\t'` 來套用。
- 解析器:`new DOMParser().parseFromString(xml, 'application/xml')` 遵循 W3C DOM Level 3 Core;錯誤以 `<parsererror>` 根元素呈現,而非丟出例外。
- 映射慣例:Badgerfish 風格以 `@attr` 表示屬性、`#text` 表示混合文字、元素本地名稱表示子元素;Parker 捨棄屬性,Spark 將屬性保留在 `$` 中。
- 具有相同名稱的重複子元素折疊為 JSON 陣列;單一子元素保持為物件——經典的「單一與多數」歧義在 XML 端無法修正。
- 有損特性:屬性(無 `@` 前綴)、命名空間(`xmlns:foo`)、處理指令、註釋、XML 宣告和 CDATA 包裝器。
- 混合內容(`<p>Hello <b>world</b>!</p>`)無法往返轉換為鍵值 JSON;元素順序在不保留鍵順序的消費者中可能遺失。
- 數值/布林值強制轉換是有意的選擇:`<age>30</age>` 可能成為 `30`(數值)或 `"30"`(字串);前導零(`007`)應保持為字串。
- 輸出格式化使用 `JSON.stringify(value, null, indent)`,縮排為 2 空格、4 空格或 `'\t'`;結果為無 BOM 的 UTF-8。
範例
簡單元素
<root>
<name>John</name>
</root>
→
{"root": {"name": "John"}}重複元素
<root>
<item>A</item>
<item>B</item>
</root>
→
{"root": {"item": ["A", "B"]}}巢狀結構
<root>
<user>
<name>John</name>
<age>30</age>
</user>
</root>
→
{"root": {"user": {"name": "John", "age": 30}}}常見問題
XML 元素如何對應到 JSON?
每個元素會變成一個 JSON 屬性,值為該元素的內容(字串或巢狀物件)。同名重複元素會聚合成陣列。屬性通常以 '@' 為字首,或集中在 '$' 之類的特殊鍵下。實際慣例會依設定而異,多數頁面允許自訂。
為什麼 XML 轉 JSON 有時會失真?
XML 區分元素、屬性、文字內容、混合內容(文字加元素)、命名空間、處理指令與註解;JSON 只有物件、陣列、字串、數字、布林與 null。把較豐富的 XML 樹對應到 JSON 時,會失去順序資訊以及「元素 vs 屬性」的區分。
混合內容元素(文字+子元素)怎麼處理?
Hello world!
並沒有乾淨的 JSON 表示法。本頁通常會用特殊鍵(例如 '#text' 或 '$')容納散落的文字,但文字與元素之間的順序未必能完整保留。如果你打算往返轉換,建議避免使用混合內容。XML 命名空間怎麼處理?
帶字首的元素(<ns:foo>)會變成字串鍵 'ns:foo',或被拆成 ns 與本地名稱兩個屬性。xmlns 宣告可能會被當成類似屬性的欄位保留,或直接捨棄,視頁面設定而定。
可以再從 JSON 還原成完全相同的 XML 嗎?
一般來說無法做到無損還原,混合內容、註解、處理指令與屬性順序尤其困難。對於單純資料用途的 XML(設定檔、簡單紀錄)通常可行;文件型 XML(DocBook、HTML、RSS)請改用真正的 XML 解析器。
空元素 <foo/> 和 <foo></foo> 一樣嗎?
對解析器而言完全一樣,兩者都會產生一個 foo 屬性,值為空字串或 null。自我關閉的寫法在 XML 中只是視覺上的差別。
轉換是在本機進行的嗎?
是。XML 解析與 JSON 生成都在你的瀏覽器中進行,本頁不會上傳你的資料。