تبدیل XML به 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 چگونه بر اساس رایجترین قرارداد (@ برای ویژگیها، #text برای متن در کنار ویژگیها) به معادل JSON نگاشت میشود. برخی ساختارها، مانند محتوای مختلط و توضیحات، نمایش استاندارد 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))))
"