XML'den JSON'a
XML'yi JSON biçimine dönüştür
XML Girdisi
JSON Çıktısı
XML'den JSON'a Dönüşüm Nedir?
XML'den JSON'a dönüşüm, verilerin Genişletilebilir İşaretleme Dili (XML) biçiminden JavaScript Nesne Gösterimi'ne (JSON) dönüştürülmesi işlemidir. Her iki biçim de yapılandırılmış, hiyerarşik verileri temsil eder; ancak farklı sözdizimi ve veri modelleri kullanır. XML, isteğe bağlı özniteliklere sahip açılış ve kapanış etiketleri kullanırken JSON, anahtar-değer çiftleri, diziler ve ilkel türler kullanır. XML'yi JSON'a dönüştürmek, XML verilerini JavaScript çalışma zamanları, REST API'leri ve NoSQL veritabanları gibi JSON'ın yerel biçim olduğu ortamlarda kullanmanızı sağlar.
Dönüşüm her zaman bire bir değildir. XML'in doğrudan JSON karşılığı bulunmayan yapıları vardır: öznitelikler, karma içerik (metin ile alt öğelerin iç içe geçmesi), işleme talimatları, yorumlar, CDATA bölümleri ve ad alanı bildirimleri. Farklı dönüşüm kütüphaneleri bu yapıları farklı biçimlerde ele alır; bu nedenle birden fazla kural seti mevcuttur. En yaygın yaklaşım, öznitelik adlarına @ öneki ekler ve aynı öğede öznitelik bulunduğunda metin içeriğini #text alanına yerleştirir.
XML'den JSON'a dönüşüm, SOAP'tan REST'e geçiş yaparken, eski kurumsal API'leri tüketirken veya XML zorunlu kılan devlet ve finans veri akışlarını işlerken sık başvurulan bir adımdır. Üreticileri ve tüketicileri aynı anda yeniden yazmak yerine ekipler, sınır katmanında XML yükünü dönüştürür ve JSON'ı aşağı akışa iletir. AWS API Gateway, Apache Camel ve MuleSoft bu kalıbı yerel olarak destekler.
<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"
}
]
}
}Neden Çevrimiçi XML'den JSON'a Dönüştürücü Kullanmalısınız?
Tek seferlik bir dönüşüm betiği yazmak zaman alır; özellikle XML öznitelikler, ad alanları veya JSON dizisine dönüşmesi gereken tekrarlayan öğeler içeriyorsa. Tarayıcı tabanlı bir dönüştürücü, yapıyı inceleyip işinize devam edebilmeniz için JSON çıktısını saniyeler içinde sunar.
XML'den JSON'a Dönüşüm Kullanım Senaryoları
XML'den JSON'a Eşleme Başvurusu
XML ve JSON farklı veri modellerine sahiptir. Aşağıdaki tablo, her XML yapısının en yaygın kurala göre (öznitelikler için @, özniteliklerle birlikte metin için #text) JSON karşılığına nasıl eşlendiğini gösterir. Karma içerik ve yorumlar gibi bazı yapıların standart JSON temsili yoktur.
| XML Yapısı | XML Örneği | JSON Karşılığı |
|---|---|---|
| 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) |
XML'den JSON'a Kural Setleri Karşılaştırması
XML'in JSON'a nasıl eşleneceğini yöneten tek bir standart yoktur. Öznitelik işleme, dizi algılama ve metin koruma açısından farklı dengeler sunan üç kural seti yaygın olarak kullanılmaktadır.
Kod Örnekleri
Aşağıda JavaScript, Python, Go ve komut satırında XML'yi JSON'a dönüştürmek için çalışan örnekler yer almaktadır. Her örnek, iç içe öğeleri ve tekrarlayan kardeş etiketleri işler.
// 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))))
"