ToolAct工具行動

XML 轉 JSON 工具

XML 輸入
JSON 輸出
行數: 1字元數: 0字節數: 0
行數: 1字元數: 0字節數: 0

什麼是 XML 轉 JSON?

XML 轉 JSON 會把 XML 標記轉成 JSON 結構,讓資料更容易在 JavaScript、API、低程式碼工具或現代資料流程中處理。這種轉換不一定直觀,因為 XML 有元素、屬性、文字節點、命名空間、順序和重複節點,而 JSON 使用物件、陣列和簡單值。這個工具適合舊系統整合、SOAP 回應、網站地圖、RSS、設定檔和測試資料。用於正式介面時,應仔細檢查屬性、空元素、混合內容、命名空間和陣列偵測如何被映射。JSON 能成功解析,不代表所有業務資訊都以預期形狀完整保留下來。

使用方式

使用方式

  1. 在左側輸入方塊中貼上或輸入 XML 資料
  2. 選擇縮排大小(2 個空格、4 個空格或 Tab)
  3. 轉換後的 JSON 會顯示於右側並附語法高亮
  4. 檢視轉換結果並修正任何 XML 錯誤
  5. 點選「Copy」或「Download」儲存結果

資料結構說明

  • XML 屬性、重複節點、命名空間和混合文字可以多種有效方式對應到 JSON;使用前請先檢查產生的結構。
  • 進行 API 移轉時,請定義欄位對應規則,而非僅依賴單一樣本的轉換結果。

使用場景

將 XML 內容轉成可讀的 JSON 進行檢查貼上 SOAP、RSS、裝置或合作夥伴的 XML,瀏覽器的 DOMParser 會將文件轉換為 JSON 物件,保留根元素、巢狀子元素,並將重複的子元素名稱折疊成陣列。數字文字以及足夠簡單的 true 或 false 值會自動轉換。解析器遵循 W3C DOM Level 3 Core 規範,因此任何 DOMParser 接受的合法 XML 1.0 輸入都能產生可遍歷的樹狀結構,後續的 JSON 轉換只是以深度優先方式走訪這棵樹,計算兄弟重複次數來決定產出單一物件還是 JSON 陣列。
在替換 XML 整合前先準備範例資料使用雙面板編輯器比對原始 XML 與格式化後的 JSON,然後複製或下載 output.json,作為遷移筆記、測試資料或 API 討論的素材。縮排可在 2 空格、4 空格和 Tab 之間切換,以符合目標程式碼庫的風格。
在進入大量解析的工作流程前,先抓出格式錯誤的 XML轉換器會顯示瀏覽器 XML 解析器的錯誤訊息,而不是默默產出不完整的結果。它專注於元素和文字內容,因此屬性、命名空間、註釋、處理指令和 Schema 驗證等細節,在需要時還是得用專門的 XML 工具處理。
決定屬性如何對應成 JSON 鍵當一個元素同時包含屬性和子元素時,屬性通常會加上 @ 前綴,避免與文字內容或具名子元素衝突。檢查產出的 JSON 中像 @id 或 @type 這類欄位,若偏好扁平的鍵名結構,可在消費端程式碼中重新命名。慣例的對應方式是:XML 屬性映射為 `@attribute`,與子元素並存的文字資料映射為 `#text`,每個子元素則以其本地名稱作為鍵名,這與許多 JSON-XML 函式庫採用的 Badgerfish 慣例一致。
辨識轉換器刻意簡化的 XML 檔案依賴屬性、命名空間、處理指令、註釋或 CDATA 區塊的文件,在 JSON 輸出中會遺失這些細節。當這些 XML 特性承載了業務資料時,應將產出結果視為快速瀏覽用的簡化檢視,而非無損遷移目標。陣列偵測只在子元素名稱重複時才會觸發,因此單一 `<item>` 和兩個 `<product>` 兄弟元素會被折疊成一個有兩個鍵的物件,而不是清單;而 Clark 表示法的命名空間 `{http://example.com/ns}user` 會被從本地名稱 `user` 中移除,這可能與另一個無命名空間的同名元素產生衝突。

技術原理

轉換從瀏覽器內建的 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。

範例

簡單元素

&lt;root>
  &lt;name>John&lt;/name>
&lt;/root>
→
{"root": {"name": "John"}}

重複元素

&lt;root>
  &lt;item>A&lt;/item>
  &lt;item>B&lt;/item>
&lt;/root>
→
{"root": {"item": ["A", "B"]}}

巢狀結構

&lt;root>
  &lt;user>
    &lt;name>John&lt;/name>
    &lt;age>30&lt;/age>
  &lt;/user>
&lt;/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 生成都在你的瀏覽器中進行,本頁不會上傳你的資料。