ToolDeck

تبدیل XML به JSON

تبدیل XML به فرمت JSON

یک مثال امتحان کنید

ورودی XML

خروجی JSON

به‌صورت محلی اجرا می‌شود · جای‌گذاری اسرار امن است
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 همگی به صورت بومی از این الگو پشتیبانی می‌کنند.

XML input
<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>
JSON output
{
  "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 دریافت کنید. نیازی به نصب کتابخانه، نوشتن اسکریپت یا پیکربندی ابزار ساخت نیست.
🔒
پردازش با اولویت حریم خصوصی
تمام فرآیند تبدیل در مرورگر شما با استفاده از JavaScript انجام می‌شود. داده‌های XML شما هرگز از دستگاه‌تان خارج نمی‌شود و به هیچ سروری ارسال نمی‌شود.
🔀
پشتیبانی از ویژگی‌ها و آرایه‌ها
ویژگی‌ها به کلیدهای دارای پیشوند @ تبدیل می‌شوند. عناصر هم‌رده تکراری به صورت خودکار در آرایه‌های JSON گروه‌بندی می‌شوند، بر اساس قرارداد Parker یا BadgerFish.
📋
بدون نیاز به حساب کاربری
صفحه را باز کنید، XML خود را پیست کنید و نتیجه JSON را کپی کنید. بدون ثبت‌نام، بدون کلید API، بدون محدودیت استفاده.

موارد استفاده از تبدیل XML به JSON

توسعه فرانت‌اند
پاسخ‌های XML از API‌ها را به JSON تبدیل کنید تا بتوانید داده‌ها را در کامپوننت‌های React، Vue یا Angular رندر کنید، بدون اینکه کتابخانه تجزیه XML به بسته سمت کلاینت خود اضافه کنید.
مهندسی بک‌اند
بارهای SOAP، فیدهای RSS/Atom یا پاسخ‌های XML-RPC را در لایه API gateway به JSON تبدیل کنید، قبل از ارسال داده به میکروسرویس‌هایی که ورودی JSON انتظار دارند.
DevOps و CI/CD
گزارش‌های آزمون XML (JUnit، NUnit، xUnit) را به JSON تبدیل کنید تا توسط داشبوردها، ربات‌های Slack یا پایپ‌لاین‌های اعلان CI سفارشی پردازش شوند.
تضمین کیفیت و آزمایش
اسنپ‌شات‌های JSON تبدیل‌شده را با خروجی مورد انتظار مقایسه کنید تا تأیید کنید ساختار پاسخ یک سرویس تولیدکننده XML بین نسخه‌ها تغییر نکرده است.
مهندسی داده
خروجی‌های XML از پورتال‌های دولتی، فیدهای مالی (FIX، FIXML) یا سیستم‌های بهداشتی (HL7 CDA) را به JSON تبدیل کنید تا در BigQuery، Snowflake یا Elasticsearch بارگذاری شوند.
یادگیری فرمت‌های داده
دانشجویانی که تبادل داده را مطالعه می‌کنند می‌توانند نمونه‌های 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
Namespacesxmlns:prefix="uri"Prefix preserved or stripped
Empty element<el/>"el": null or ""
Comments<!-- note -->Discarded (no JSON equivalent)

مقایسه قراردادهای تبدیل XML به JSON

هیچ استاندارد واحدی بر نحوه نگاشت XML به JSON حاکم نیست. سه قرارداد به طور گسترده استفاده می‌شوند، هر کدام با مبادلات متفاوت برای مدیریت ویژگی‌ها، تشخیص آرایه‌ها و حفظ متن.

BadgerFish
هر گره متنی در یک کلید $ قرار می‌گیرد. ویژگی‌ها کلیدهای دارای پیشوند @ دریافت می‌کنند. فضاهای نام به عنوان ورودی‌های @xmlns حفظ می‌شوند. پرحجم اما بدون اتلاف: می‌توانید برای بازگشت به XML بدون از دست دادن داده تبدیل معکوس انجام دهید.
Parker
ویژگی‌ها را کاملاً حذف می‌کند و عناصر متن‌فقط را به مقادیر خالص تبدیل می‌کند. عناصر تکراری به آرایه تبدیل می‌شوند. فشرده و تمیز، اما مخرب: ویژگی‌ها و اطلاعات فضای نام دور انداخته می‌شوند.
GData (Google Data)
از $t برای محتوای متنی استفاده می‌کند و ویژگی‌ها را بدون پیشوند به عنوان کلیدهای سطح بالا حفظ می‌کند. حد وسطی بین پرحجمی BadgerFish و سادگی Parker. در تاریخچه در API‌های گوگل استفاده شده است.

مثال‌های کد

در ادامه مثال‌های کاربردی برای تبدیل XML به JSON در JavaScript، Python، Go و خط فرمان آمده است. هر مثال عناصر تودرتو و تگ‌های هم‌رده تکراری را مدیریت می‌کند.

JavaScript (browser)
// 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" }
Python
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))
Go
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"] }
}
CLI (xmllint + jq / yq)
# 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))))
"

سؤالات متداول

آیا تبدیل XML به JSON بدون اتلاف است؟
نه همیشه. ویژگی‌های XML، توضیحات، دستورالعمل‌های پردازش و اعلان‌های فضای نام معادل مستقیم JSON ندارند. اکثر مبدل‌ها ویژگی‌ها را با قرارداد پیشوند @ حفظ می‌کنند، اما توضیحات و دستورالعمل‌های پردازش دور انداخته می‌شوند. اگر به تبدیل معکوس کاملاً قابل بازگشت نیاز دارید، از قرارداد بدون اتلاف مانند BadgerFish استفاده کنید.
ویژگی‌های XML چگونه در JSON نمایش داده می‌شوند؟
رایج‌ترین رویکرد این است که نام ویژگی‌ها با @ پیشوند گذاشته شوند. به عنوان مثال، <book id="1"> به {"@id": "1"} تبدیل می‌شود. برخی مبدل‌ها به جای آن از یک شیء تودرتوی "_attributes" استفاده می‌کنند. قرارداد خاص به کتابخانه‌ای که استفاده می‌کنید بستگی دارد.
مبدل چگونه عناصر XML تکراری را مدیریت می‌کند؟
هنگامی که یک عنصر بیش از یک بار در زیر همان والد ظاهر می‌شود، مبدل آن‌ها را در یک آرایه JSON گروه‌بندی می‌کند. به عنوان مثال، دو عنصر هم‌رده item به {"item": ["a", "b"]} تبدیل می‌شوند. یک عنصر item منفرد به عنوان یک مقدار رشته ساده باقی می‌ماند، مگر اینکه حالت اجبار-آرایه فعال باشد.
آیا می‌توانم JSON را به XML تبدیل کنم؟
بله، اما نتیجه به قرارداد مورد استفاده در تبدیل اولیه بستگی دارد. اگر ویژگی‌ها با پیشوند @ حفظ شده بودند، یک مبدل JSON به XML می‌تواند آن‌ها را بازسازی کند. اگر تبدیل اصلی از Parker استفاده کرده بود (که ویژگی‌ها را حذف می‌کند)، آن اطلاعات از بین رفته‌اند. ToolDeck همچنین یک ابزار JSON به XML برای جهت معکوس دارد.
در طول تبدیل چه اتفاقی برای فضاهای نام XML می‌افتد؟
مدیریت فضای نام بر اساس کتابخانه متفاوت است. برخی مبدل‌ها پیشوند را در نام کلید حفظ می‌کنند (مثلاً "ns:element")، برخی دیگر اعلان‌های xmlns را به فیلدهای جداگانه نگاشت می‌کنند، و برخی فضاهای نام را کاملاً حذف می‌کنند. خروجی را برای XML خاص خود بررسی کنید تا رفتار فضای نام را تأیید کنید.
آیا استانداردی برای تبدیل XML به JSON وجود دارد؟
هیچ استاندارد رسمی W3C یا IETF وجود ندارد. نزدیک‌ترین مراجع قرارداد BadgerFish، قرارداد Parker و نگاشت OASIS XSLT-to-JSON هستند. در عمل، هر کتابخانه قوانین خود را پیاده‌سازی می‌کند، به همین دلیل یک XML یکسان می‌تواند در ابزارهای مختلف JSON کمی متفاوتی تولید کند.
چگونه فایل‌های XML بزرگ را مدیریت کنم؟
مبدل‌های مبتنی بر مرورگر برای فایل‌های تا چند مگابایت به خوبی کار می‌کنند. برای فایل‌های بزرگ‌تر (۱۰ مگابایت به بالا)، از یک تجزیه‌گر جریانی مانند iterparse پایتون (xml.etree.ElementTree) یا xml-stream در Node.js استفاده کنید. این‌ها سند را به صورت تدریجی پردازش می‌کنند بدون اینکه کل درخت را در حافظه بارگذاری کنند.