跳至內容

JSON 轉 XML

將 JSON 轉成可讀的 XML,根元素名稱可調。

即時
輸入

這個工具的用途

將 JSON 轉為美化排版的 XML 1.0,可指定根元素名稱 與選用的 <?xml version="1.0"?> 宣告。 適合用於對接舊式 SOAP 服務的適配器、從 JSON 來源產生 RSS / Atom 載荷、 或餵進尚未退役的 XSLT pipeline。

對應方式是純元素且具確定性:每個 JSON 物件鍵成為一個子元素、陣列重複 父元素名稱、原始值成為被逸出的文字內容。沒有屬性/元素的啟發式、 也不會推測 schema——輸入是什麼,輸出就是什麼,只是包上標籤而已。 完全在你的瀏覽器內運作;沒有伺服器、沒有遙測。

使用步驟

貼上 JSON(或載入範例),指定根元素名稱,即可在右側讀到 XML。 計劃存檔的請開啟 <?xml …?> 宣告,只是要嵌入 他處的片段就關掉。美化縮排固定為 2 個空白。

輸入: {"service":"devsmiths","version":2,"public":true}

輸出(XML):

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <service>devsmiths</service>
  <version>2</version>
  <public>true</public>
</root>

限制與邊界情況

  • 方向只有 JSON → XML。反向(XML → JSON)有多種有效對應方式—— 屬性 vs 元素、#text vs 匿名字串、命名空間前綴——一個 通用轉換器反而會幫倒忙。不在 P1 範圍。
  • 對應方式純元素。沒有屬性/元素的啟發式,不會推測 schema(DTD / XSD / RelaxNG),也不會宣告命名空間。每個 JSON 鍵成為子元素; 原始值成為文字內容。
  • 陣列會重複父元素名稱:"tags": ["a","b"] 會變成 <tags>a</tags><tags>b</tags>。 這是「child-list」對應方式——熟悉 RSS / Atom 的人應該不陌生——而非 「wrapper element」方式 (<tags><tag>a</tag>…)。
  • 不是合法 XML Name 的 JSON 鍵會產生無效的 XML 輸出——例如含空白、以數字開頭、含冒號 (看起來像 XML 命名空間)、或字元超出 Name production 的鍵。 轉換前請先在你的 JSON 內清理鍵名;工具不會悄悄改寫它們。
  • 布林與數字渲染為未加引號的文字:<active>true</active> 而非 <active>"true"</active>。 期待 XML Schema 型別元素的消費者必須自行解析文字內容——XML 本身 沒有原生型別系統。
  • 輸入無效 JSON 時請先用 JSON Repair。 關於 JSON 在傳輸上多半取代 XML(以及 XML 至今仍勝出的場景——文件、 混合內容、XSLT),請參考 JSON vs YAML vs XML

常見問題

為什麼原始值不會輸出為 XML 屬性?
因為「何時用屬性、何時用元素」沒有公認的規則。JSON `{"id": 1, "name": "x"}` 可以變成 `<root id="1" name="x"/>`,也可以是 `<root><id>1</id><name>x</name></root>`——兩者都合法、都有下游消費者。轉換器選擇純元素,因為反向解析無歧義,而且大多數現代 XML 消費者(DOM、XPath、XSLT)對屬性與元素一視同仁。
可以加上像 xmlns:atom='…' 的 XML 命名空間嗎?
UI 不支援。命名空間是應用層語意,不是 JSON 結構——工具沒辦法知道哪些鍵應該屬於哪個命名空間。變通做法:不帶命名空間轉換完畢後,手動在根元素加上 `xmlns` 屬性(就一行)。若要做非平凡的命名空間對應,轉換後接一段 XSLT 處理。
輸出 XML 是什麼編碼?可以改嗎?
永遠是 UTF-8——轉換輸出的是 Unicode 字串,由瀏覽器下載時以 UTF-8 寫出。XML 宣告寫明 `encoding="UTF-8"` 對應。若消費者真的需要 UTF-16 或 ISO-8859-1,做完轉換後在命令列用 `iconv` 轉碼輸出檔案;在瀏覽器端嵌入非 UTF-8 字串比轉碼位元組更容易出錯。
為什麼我的鍵 `2024-tax-year` 產生無效的 XML?
XML 元素名不能以數字開頭,而 `2024-tax-year` 就是。XML 規範的 <a href='https://www.w3.org/TR/xml/#NT-Name'>Name production</a> 限制首字元只能是字母、底線或冒號(不建議),後續字元也只能來自一小組允許字元。請在轉換前重新命名 JSON 鍵(例如 `taxYear2024` 或 `_2024-tax-year`)。工具不會悄悄改寫鍵名,因為悄悄改寫會遺失資訊。
可以為純字串產生 CData 區塊嗎?
不行。每個文字值都會經過 XML 逸出(`&` → `&amp;`、`<` → `&lt;` 等),對 XML parser 而言語意上等同 CData。CData 的存在是為了人類讀內嵌標記方便(XML 內的 XHTML、XSLT 內的 script);轉換器無法判斷哪個字串是標記,因此一律逸出。輸出能在任何符合規範的 XML parser 之間以相同結果來回。
輸出是 XML 1.0 還是 1.1?
XML 1.0。XML 1.1 在 production 環境罕見(它放寬了 Name 字元;幾乎沒有消費者升級)。XML 宣告寫明 `version="1.0"`。若你真的需要 1.1,複製輸出後手動編輯宣告行——文件主體與兩個版本都相容,因為轉換器永遠不會輸出 1.0 禁止但 1.1 允許的字元。

內容審閱者: