XML na JSON
Konwertuj XML do formatu JSON
Wejście XML
Wyjście JSON
Czym jest konwersja XML na JSON?
Konwersja XML na JSON to proces przekształcania danych z formatu Extensible Markup Language (XML) do JavaScript Object Notation (JSON). Oba formaty reprezentują dane strukturalne i hierarchiczne, lecz używają różnej składni i różnych modeli danych. XML używa tagów otwierających i zamykających z opcjonalnymi atrybutami, natomiast JSON korzysta z par klucz-wartość, tablic i typów prymitywnych. Konwersja XML na JSON pozwala pracować z danymi XML w środowiskach, w których JSON jest formatem natywnym, takich jak środowiska uruchomieniowe JavaScript, REST API i bazy danych NoSQL.
Konwersja nie zawsze jest odwzorowaniem jeden do jednego. XML posiada konstrukcje niemające bezpośredniego odpowiednika w JSON: atrybuty, treść mieszaną (tekst przeplatany elementami potomnymi), instrukcje przetwarzania, komentarze, sekcje CDATA i deklaracje przestrzeni nazw. Różne biblioteki konwersji obsługują te konstrukcje w różny sposób, dlatego istnieje wiele konwencji. Najczęstszy sposób polega na poprzedzaniu nazw atrybutów symbolem @ i umieszczaniu treści tekstowej w polu #text, gdy ten sam element zawiera jednocześnie atrybuty.
Konwersja XML na JSON jest powszechnym krokiem przy migracji z SOAP na REST, korzystaniu z przestarzałych enterprise API lub przetwarzaniu rządowych i finansowych strumieni danych wymagających formatu XML. Zamiast jednoczesnego przepisywania producentów i konsumentów, zespoły konwertują ładunek XML na granicy warstw i przekazują JSON dalej. AWS API Gateway, Apache Camel i MuleSoft obsługują ten wzorzec natywnie.
<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"
}
]
}
}Dlaczego warto używać internetowego konwertera XML na JSON?
Pisanie jednorazowego skryptu konwersji zajmuje czas, szczególnie gdy XML zawiera atrybuty, przestrzenie nazw lub powtarzające się elementy, które muszą stać się tablicami JSON. Konwerter działający w przeglądarce zwraca wynik w JSON w ciągu sekund, dzięki czemu możesz sprawdzić strukturę i przejść dalej.
Zastosowania konwertera XML na JSON
Tabela odwzorowania XML na JSON
XML i JSON mają różne modele danych. Poniższa tabela pokazuje, jak każda konstrukcja XML mapuje się na odpowiednik JSON zgodnie z najpowszechniejszą konwencją (@ dla atrybutów, #text dla tekstu obok atrybutów). Niektóre konstrukcje, takie jak treść mieszana i komentarze, nie mają standardowej reprezentacji w JSON.
| Konstrukcja XML | Przykład XML | Odpowiednik 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) |
Porównanie konwencji XML na JSON
Nie istnieje jeden standard regulujący sposób mapowania XML na JSON. Szeroko stosowane są trzy konwencje, z których każda ma inne zalety i wady w zakresie obsługi atrybutów, wykrywania tablic i zachowania tekstu.
Przykłady kodu
Poniżej znajdują się działające przykłady konwersji XML na JSON w JavaScript, Python, Go i wierszu poleceń. Każdy przykład obsługuje zagnieżdżone elementy i powtarzające się tagi rodzeństwa.
// 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))))
"