XML to JSON
Konversi XML ke format JSON
Input XML
Output JSON
Apa itu Konversi XML ke JSON?
Konversi XML ke JSON adalah proses mengubah data dari Extensible Markup Language (XML) menjadi JavaScript Object Notation (JSON). Kedua format tersebut merepresentasikan data terstruktur dan hierarkis, tetapi menggunakan sintaks dan model data yang berbeda. XML menggunakan tag pembuka dan penutup dengan atribut opsional, sedangkan JSON menggunakan pasangan key-value, larik, dan tipe primitif. Mengonversi XML ke JSON memungkinkan Anda bekerja dengan data XML di lingkungan di mana JSON adalah format aslinya, seperti runtime JavaScript, REST API, dan database NoSQL.
Konversi tidak selalu bersifat satu-ke-satu. XML memiliki konstruksi yang tidak memiliki padanan langsung dalam JSON: atribut, konten campuran (teks yang diselingi dengan elemen anak), instruksi pemrosesan, komentar, bagian CDATA, dan deklarasi namespace. Berbagai pustaka konversi menangani konstruksi ini secara berbeda, itulah mengapa ada beberapa konvensi yang berbeda. Pendekatan paling umum memberi prefiks nama atribut dengan @ dan menempatkan konten teks di field #text ketika atribut ada pada elemen yang sama.
Konversi XML ke JSON adalah langkah umum saat bermigrasi dari SOAP ke REST, mengonsumsi API enterprise lama, atau memproses feed data pemerintah dan keuangan yang mewajibkan XML. Alih-alih menulis ulang produsen dan konsumen secara bersamaan, tim mengonversi payload XML di lapisan batas dan meneruskan JSON ke hilir. AWS API Gateway, Apache Camel, dan MuleSoft semuanya mendukung pola ini secara native.
<bookstore>
<book category="fiction">
<title lang="en">The Great Gatsby</title>
<author>F. Scott Fitzgerald</author>
<year>1925</year>
<price>10.99</price>
</book>
<book category="non-fiction">
<title lang="en">Sapiens</title>
<author>Yuval Noah Harari</author>
<year>2011</year>
<price>14.99</price>
</book>
</bookstore>{
"bookstore": {
"book": [
{
"@category": "fiction",
"title": {
"@lang": "en",
"#text": "The Great Gatsby"
},
"author": "F. Scott Fitzgerald",
"year": "1925",
"price": "10.99"
},
{
"@category": "non-fiction",
"title": {
"@lang": "en",
"#text": "Sapiens"
},
"author": "Yuval Noah Harari",
"year": "2011",
"price": "14.99"
}
]
}
}Mengapa Menggunakan Konverter XML ke JSON Online?
Menulis skrip konversi sekali pakai membutuhkan waktu, terutama ketika XML mengandung atribut, namespace, atau elemen berulang yang perlu menjadi larik JSON. Konverter berbasis browser memberikan output JSON dalam hitungan detik sehingga Anda dapat memeriksa strukturnya dan langsung melanjutkan.
Kasus Penggunaan XML ke JSON
Referensi Pemetaan XML ke JSON
XML dan JSON memiliki model data yang berbeda. Tabel di bawah menunjukkan bagaimana setiap konstruksi XML dipetakan ke padanan JSON-nya di bawah konvensi paling umum (@ untuk atribut, #text untuk teks yang berdampingan dengan atribut). Beberapa konstruksi, seperti konten campuran dan komentar, tidak memiliki representasi JSON yang standar.
| Konstruksi XML | Contoh XML | Padanan JSON |
|---|---|---|
| Element | <name>text</name> | "name": "text" |
| Nested elements | <a><b>1</b></a> | "a": { "b": "1" } |
| Attributes | <el attr="v"/> | "el": { "@attr": "v" } |
| Text + attributes | <el a="1">text</el> | "el": { "@a": "1", "#text": "text" } |
| Repeated elements | <r><i>1</i><i>2</i></r> | "r": { "i": ["1", "2"] } |
| Mixed content | <p>A <b>B</b> C</p> | Varies by convention |
| CDATA | <![CDATA[raw]]> | "#cdata": "raw" or flattened |
| Namespaces | xmlns:prefix="uri" | Prefix preserved or stripped |
| Empty element | <el/> | "el": null or "" |
| Comments | <!-- note --> | Discarded (no JSON equivalent) |
Perbandingan Konvensi XML ke JSON
Tidak ada standar tunggal yang mengatur cara XML dipetakan ke JSON. Tiga konvensi banyak digunakan, masing-masing dengan pertimbangan berbeda untuk penanganan atribut, deteksi larik, dan pelestarian teks.
Contoh Kode
Berikut adalah contoh yang dapat digunakan untuk mengonversi XML ke JSON dalam JavaScript, Python, Go, dan baris perintah. Setiap contoh menangani elemen bersarang dan tag saudara yang berulang.
// Using the DOMParser API to walk XML and build a JSON object
function xmlToJson(xml) {
const parser = new DOMParser()
const doc = parser.parseFromString(xml, 'application/xml')
function nodeToObj(node) {
const obj = {}
// Handle attributes
if (node.attributes) {
for (const attr of node.attributes) {
obj['@' + attr.name] = attr.value
}
}
// Handle child nodes
for (const child of node.childNodes) {
if (child.nodeType === 3) { // text
const text = child.textContent.trim()
if (text) obj['#text'] = text
} else if (child.nodeType === 1) { // element
const key = child.nodeName
const val = nodeToObj(child)
if (obj[key]) {
if (!Array.isArray(obj[key])) obj[key] = [obj[key]]
obj[key].push(val)
} else {
obj[key] = val
}
}
}
// Simplify text-only nodes
const keys = Object.keys(obj)
if (keys.length === 1 && keys[0] === '#text') return obj['#text']
return obj
}
return nodeToObj(doc.documentElement)
}
const xml = '<user><name>Alice</name><role>admin</role></user>'
console.log(JSON.stringify(xmlToJson(xml), null, 2))
// → { "name": "Alice", "role": "admin" }import xmltodict
import json
xml = """
<user>
<name>Alice</name>
<roles>
<role>admin</role>
<role>editor</role>
</roles>
</user>
"""
# xmltodict converts XML to an OrderedDict
result = xmltodict.parse(xml)
print(json.dumps(result, indent=2))
# → {
# → "user": {
# → "name": "Alice",
# → "roles": { "role": ["admin", "editor"] }
# → }
# → }
# With the standard library (xml.etree.ElementTree)
import xml.etree.ElementTree as ET
def etree_to_dict(elem):
d = {}
if elem.attrib:
d.update({f"@{k}": v for k, v in elem.attrib.items()})
for child in elem:
child_data = etree_to_dict(child)
if child.tag in d:
if not isinstance(d[child.tag], list):
d[child.tag] = [d[child.tag]]
d[child.tag].append(child_data)
else:
d[child.tag] = child_data
if elem.text and elem.text.strip():
if d:
d["#text"] = elem.text.strip()
else:
return elem.text.strip()
return d
root = ET.fromstring(xml)
print(json.dumps(etree_to_dict(root), indent=2))package main
import (
"encoding/json"
"encoding/xml"
"fmt"
"strings"
)
// For simple, known schemas — define a struct
type User struct {
XMLName xml.Name `xml:"user"`
Name string `xml:"name"`
Roles []string `xml:"roles>role"`
}
func main() {
data := `<user><name>Alice</name><roles><role>admin</role><role>editor</role></roles></user>`
var user User
xml.NewDecoder(strings.NewReader(data)).Decode(&user)
out, _ := json.MarshalIndent(user, "", " ")
fmt.Println(string(out))
// → { "Name": "Alice", "Roles": ["admin", "editor"] }
}# Using xq (part of yq, a jq wrapper for XML)
# Install: pip install yq OR brew install yq
echo '<user><name>Alice</name></user>' | xq .
# → { "user": { "name": "Alice" } }
# Using xmlstarlet + jq
xmlstarlet sel -t -v '//name' input.xml | jq -R '{ name: . }'
# Node.js one-liner with xml2js
echo '<a><b>1</b></a>' | node -e "
const {parseString} = require('xml2js');
let d=''; process.stdin.on('data',c=>d+=c);
process.stdin.on('end',()=>parseString(d,(e,r)=>console.log(JSON.stringify(r,null,2))))
"