XML to JSON
Převeďte XML do formátu JSON
XML Vstup
JSON Výstup
Co je převod XML na JSON?
Převod XML na JSON je proces transformace dat z Extensible Markup Language (XML) do JavaScript Object Notation (JSON). Oba formáty reprezentují strukturovaná hierarchická data, ale používají odlišnou syntaxi a datové modely. XML používá otevírací a uzavírací značky s volitelnými atributy, zatímco JSON používá páry klíč–hodnota, pole a primitivní typy. Převod XML na JSON umožňuje pracovat s XML daty v prostředích, kde je JSON nativním formátem — například v JavaScriptových prostředích, REST API a NoSQL databázích.
Převod není vždy jednoznačný. XML obsahuje konstrukty bez přímého ekvivalentu v JSON: atributy, smíšený obsah (text prokládaný podřízenými prvky), zpracovatelské instrukce, komentáře, sekce CDATA a deklarace jmenných prostorů. Různé převodní knihovny zpracovávají tyto konstrukty odlišně, proto existuje více konvencí. Nejčastější přístup přidává před názvy atributů znak @ a umísťuje textový obsah do pole #text, pokud jsou na stejném prvku přítomny atributy.
Převod XML na JSON je běžným krokem při migraci z SOAP na REST, při konzumaci starších podnikových API nebo při zpracování vládních a finančních datových kanálů, které vyžadují XML. Namísto souběžného přepisování producentů a konzumentů týmy převádějí XML payload na hranici a předávají JSON dál. AWS API Gateway, Apache Camel a MuleSoft tento vzor nativně podporují.
<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"
}
]
}
}Proč použít online převodník XML na JSON?
Psaní jednorázového převodního skriptu zabere čas, zejména pokud XML obsahuje atributy, jmenné prostory nebo opakující se prvky, které je třeba převést na JSON pole. Převodník v prohlížeči vám poskytne výstup JSON během několika sekund, abyste mohli zkontrolovat strukturu a pokračovat v práci.
Případy použití převodníku XML na JSON
Referenční tabulka mapování XML na JSON
XML a JSON mají odlišné datové modely. Tabulka níže ukazuje, jak se každý konstrukt XML mapuje na ekvivalent v JSON podle nejběžnější konvence (@ pro atributy, #text pro text společně s atributy). Některé konstrukty, jako smíšený obsah a komentáře, nemají standardní reprezentaci v JSON.
| Konstrukt XML | Příklad XML | Ekvivalent 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) |
Srovnání konvencí pro převod XML na JSON
Neexistuje jediný standard, který by určoval, jak se XML mapuje na JSON. Jsou rozšířeny tři konvence, každá s jinými kompromisy pro zpracování atributů, detekci polí a zachování textu.
Ukázky kódu
Níže jsou funkční příklady pro převod XML na JSON v JavaScriptu, Pythonu, Go a na příkazovém řádku. Každý příklad zpracovává zanořené prvky a opakující se sourozenecké značky.
// 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))))
"