XML to JSON
Преобразует XML в формат JSON
Входные данные XML
Выходные данные JSON
Что такое преобразование XML в JSON?
Преобразование XML в JSON — это процесс трансформации данных из формата Extensible Markup Language (XML) в JavaScript Object Notation (JSON). Оба формата представляют структурированные иерархические данные, но используют разный синтаксис и модели данных. XML использует открывающие и закрывающие теги с необязательными атрибутами, тогда как JSON — пары ключ-значение, массивы и примитивные типы. Преобразование XML в JSON позволяет работать с данными XML в средах, где JSON является нативным форматом: JavaScript-окружениях, REST API и NoSQL-базах данных.
Преобразование не всегда взаимно однозначно. В XML есть конструкции, не имеющие прямого аналога в JSON: атрибуты, смешанное содержимое (текст вперемежку с дочерними элементами), инструкции по обработке, комментарии, секции CDATA и объявления пространств имён. Разные библиотеки обрабатывают эти конструкции по-разному, что породило множество соглашений. Наиболее распространённый подход — добавлять к именам атрибутов префикс @ и помещать текстовое содержимое в поле #text, когда у элемента одновременно есть атрибуты.
Преобразование XML в JSON — распространённый шаг при переходе с SOAP на REST, при работе с устаревшими корпоративными API или при обработке государственных и финансовых потоков данных, которые требуют XML. Вместо того чтобы одновременно переписывать производителей и потребителей данных, команды конвертируют XML-нагрузку на граничном уровне и передают JSON дальше по цепочке. AWS API Gateway, Apache Camel и MuleSoft поддерживают этот подход нативно.
<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"
}
]
}
}Зачем использовать онлайн-конвертер XML в JSON?
Написание одноразового скрипта для преобразования требует времени, особенно когда XML содержит атрибуты, пространства имён или повторяющиеся элементы, которые должны стать JSON-массивами. Браузерный конвертер выдаёт JSON-результат за секунды, позволяя сразу изучить структуру и двигаться дальше.
Сценарии использования конвертера XML в JSON
Справочник по сопоставлению XML и JSON
XML и JSON имеют разные модели данных. В таблице ниже показано, как каждая конструкция XML сопоставляется с эквивалентом в JSON по наиболее распространённому соглашению (@ для атрибутов, #text для текста при наличии атрибутов). Некоторые конструкции, например смешанное содержимое и комментарии, не имеют стандартного представления в JSON.
| Конструкция XML | Пример XML | Эквивалент в 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) |
Сравнение соглашений по преобразованию XML в JSON
Единого стандарта преобразования XML в JSON не существует. Широко используются три соглашения, каждое со своими компромиссами в части обработки атрибутов, определения массивов и сохранения текста.
Примеры кода
Ниже приведены рабочие примеры преобразования XML в JSON на JavaScript, Python, Go и в командной строке. Каждый пример обрабатывает вложенные элементы и повторяющиеся соседние теги.
// 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))))
"