ToolDeck

XML sang JSON

Chuyển đổi XML sang định dạng JSON

Thử ví dụ

Nhập XML

Xuất JSON

Chạy cục bộ · An toàn để dán thông tin bí mật
JSON sẽ xuất hiện tại đây…

Chuyển đổi XML sang JSON là gì?

Chuyển đổi XML sang JSON là quá trình biến đổi dữ liệu từ Extensible Markup Language (XML) sang JavaScript Object Notation (JSON). Cả hai định dạng đều biểu diễn dữ liệu có cấu trúc phân cấp, nhưng sử dụng cú pháp và mô hình dữ liệu khác nhau. XML dùng thẻ mở và đóng kèm thuộc tính tùy chọn, trong khi JSON dùng cặp khóa-giá trị, mảng và kiểu nguyên thủy. Chuyển đổi XML sang JSON cho phép bạn làm việc với dữ liệu XML trong các môi trường mà JSON là định dạng gốc, chẳng hạn như JavaScript runtime, REST API và cơ sở dữ liệu NoSQL.

Việc chuyển đổi không phải lúc nào cũng tương đương một-một. XML có các cấu trúc không có tương đương trực tiếp trong JSON: thuộc tính, nội dung hỗn hợp (văn bản xen kẽ với phần tử con), chỉ thị xử lý, chú thích, phần CDATA và khai báo không gian tên. Các thư viện chuyển đổi khác nhau xử lý những cấu trúc này theo cách khác nhau, đó là lý do tồn tại nhiều quy ước. Cách phổ biến nhất là thêm tiền tố @ vào tên thuộc tính và đặt nội dung văn bản vào trường #text khi phần tử vừa có thuộc tính vừa có văn bản.

Chuyển đổi XML sang JSON là bước thường gặp khi di chuyển từ SOAP sang REST, sử dụng các API doanh nghiệp kế thừa, hoặc xử lý luồng dữ liệu chính phủ và tài chính yêu cầu XML. Thay vì viết lại cả phía phát và phía nhận cùng lúc, các nhóm chuyển đổi tải trọng XML tại lớp biên và truyền JSON xuống phía sau. AWS API Gateway, Apache Camel và MuleSoft đều hỗ trợ mẫu này theo cách gốc.

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"
      }
    ]
  }
}

Tại sao sử dụng công cụ chuyển đổi XML sang JSON trực tuyến?

Viết một đoạn script chuyển đổi riêng lẻ tốn thời gian, đặc biệt khi XML chứa thuộc tính, không gian tên hoặc các phần tử lặp lại cần trở thành mảng JSON. Một công cụ chạy trên trình duyệt cho đầu ra JSON trong vài giây để bạn kiểm tra cấu trúc và tiếp tục công việc.

Chuyển đổi tức thì
Dán XML và nhận đầu ra JSON ngay lập tức. Không cần cài đặt thư viện, viết script hay cấu hình build tool.
🔒
Xử lý ưu tiên quyền riêng tư
Toàn bộ quá trình chuyển đổi chạy trong trình duyệt bằng JavaScript. Dữ liệu XML của bạn không bao giờ rời khỏi máy và không bao giờ được tải lên bất kỳ máy chủ nào.
🔀
Xử lý thuộc tính và mảng
Thuộc tính được ánh xạ sang khóa có tiền tố @. Các phần tử anh em lặp lại được gộp tự động vào mảng JSON theo quy ước Parker hoặc BadgerFish.
📋
Không cần tài khoản
Mở trang, dán XML và sao chép kết quả JSON. Không đăng ký, không cần API key, không giới hạn sử dụng.

Các trường hợp sử dụng chuyển đổi XML sang JSON

Phát triển frontend
Chuyển đổi phản hồi XML từ API sang JSON để hiển thị dữ liệu trong các component React, Vue hoặc Angular mà không cần thêm thư viện phân tích XML vào bundle phía client.
Kỹ thuật backend
Biến đổi tải trọng SOAP, luồng RSS/Atom hoặc phản hồi XML-RPC sang JSON tại lớp API gateway trước khi truyền dữ liệu đến các microservice nhận đầu vào JSON.
DevOps và CI/CD
Chuyển đổi báo cáo kiểm thử XML (JUnit, NUnit, xUnit) sang JSON để đưa vào dashboard, Slack bot hoặc pipeline thông báo CI tùy chỉnh.
QA và kiểm thử
So sánh các ảnh chụp JSON đã chuyển đổi với đầu ra mong đợi để xác minh rằng một dịch vụ sinh XML chưa thay đổi cấu trúc phản hồi giữa các phiên bản.
Kỹ thuật dữ liệu
Chuyển đổi các bản xuất XML từ cổng dữ liệu chính phủ, luồng tài chính (FIX, FIXML) hoặc hệ thống y tế (HL7 CDA) sang JSON để nạp vào BigQuery, Snowflake hoặc Elasticsearch.
Học các định dạng dữ liệu
Sinh viên học trao đổi dữ liệu có thể dán mẫu XML vào công cụ chuyển đổi để thấy chính xác cách các phần tử, thuộc tính và cấu trúc lồng nhau ánh xạ sang khóa, đối tượng và mảng JSON.

Tham chiếu ánh xạ XML sang JSON

XML và JSON có mô hình dữ liệu khác nhau. Bảng dưới đây cho thấy cách mỗi cấu trúc XML ánh xạ sang tương đương JSON theo quy ước phổ biến nhất (@ cho thuộc tính, #text cho văn bản khi có cả thuộc tính). Một số cấu trúc như nội dung hỗn hợp và chú thích không có biểu diễn JSON chuẩn.

Cấu trúc XMLVí dụ XMLTương đương 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)

So sánh các quy ước chuyển đổi XML sang JSON

Không có tiêu chuẩn duy nhất nào quy định cách XML ánh xạ sang JSON. Ba quy ước được sử dụng rộng rãi, mỗi quy ước có sự đánh đổi khác nhau về xử lý thuộc tính, phát hiện mảng và bảo toàn văn bản.

BadgerFish
Mỗi nút văn bản đặt vào khóa $. Thuộc tính có khóa có tiền tố @. Không gian tên được bảo toàn dưới dạng mục nhập @xmlns. Dài dòng nhưng không mất thông tin: bạn có thể chuyển ngược lại sang XML mà không mất dữ liệu.
Parker
Bỏ toàn bộ thuộc tính và chuyển các phần tử chỉ có văn bản thành giá trị thuần. Các phần tử lặp trở thành mảng. Gọn gàng và sạch, nhưng có mất mát: thuộc tính và thông tin không gian tên bị loại bỏ.
GData (Google Data)
Dùng $t cho nội dung văn bản và bảo toàn thuộc tính như các khóa cấp cao nhất không có tiền tố. Là trung gian giữa sự dài dòng của BadgerFish và tính đơn giản của Parker. Từng được dùng trong các Google API.

Ví dụ mã nguồn

Dưới đây là các ví dụ hoạt động để chuyển đổi XML sang JSON trong JavaScript, Python, Go và dòng lệnh. Mỗi ví dụ xử lý các phần tử lồng nhau và các thẻ anh em lặp lại.

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))))
"

Câu hỏi thường gặp

Chuyển đổi XML sang JSON có mất thông tin không?
Không phải lúc nào cũng vậy. Thuộc tính XML, chú thích, chỉ thị xử lý và khai báo không gian tên không có tương đương trực tiếp trong JSON. Hầu hết các công cụ chuyển đổi bảo toàn thuộc tính bằng quy ước tiền tố @, nhưng chú thích và chỉ thị xử lý bị loại bỏ. Nếu cần chuyển đổi hai chiều hoàn toàn, hãy dùng quy ước không mất mát như BadgerFish.
Thuộc tính XML được biểu diễn trong JSON như thế nào?
Cách phổ biến nhất là thêm tiền tố @ vào tên thuộc tính. Ví dụ, <book id="1"> trở thành {"@id": "1"}. Một số công cụ dùng đối tượng lồng "_attributes" thay thế. Quy ước cụ thể phụ thuộc vào thư viện bạn sử dụng.
Công cụ xử lý các phần tử XML lặp lại như thế nào?
Khi một phần tử xuất hiện nhiều hơn một lần dưới cùng phần tử cha, công cụ sẽ gộp chúng vào một mảng JSON. Ví dụ, hai phần tử anh em item trở thành {"item": ["a", "b"]}. Một phần tử item đơn lẻ vẫn là giá trị chuỗi thuần trừ khi bật chế độ force-array.
Tôi có thể chuyển JSON ngược lại sang XML không?
Được, nhưng kết quả phụ thuộc vào quy ước được dùng trong lần chuyển đổi ban đầu. Nếu thuộc tính được bảo toàn với tiền tố @, một công cụ chuyển đổi JSON sang XML có thể tái tạo lại chúng. Nếu lần chuyển đổi gốc dùng Parker (bỏ thuộc tính), thông tin đó đã mất. ToolDeck cũng có công cụ JSON sang XML cho chiều ngược lại.
Điều gì xảy ra với không gian tên XML trong quá trình chuyển đổi?
Xử lý không gian tên khác nhau theo thư viện. Một số công cụ bảo toàn tiền tố trong tên khóa (ví dụ "ns:element"), một số ánh xạ khai báo xmlns sang các trường riêng, và một số bỏ hoàn toàn không gian tên. Kiểm tra đầu ra với XML cụ thể của bạn để xác minh hành vi không gian tên.
Có tiêu chuẩn nào cho việc chuyển đổi XML sang JSON không?
Không có tiêu chuẩn chính thức nào của W3C hay IETF. Các tài liệu tham chiếu gần nhất là quy ước BadgerFish, quy ước Parker và ánh xạ OASIS XSLT-to-JSON. Trong thực tế, mỗi thư viện triển khai quy tắc riêng, đó là lý do cùng một XML có thể tạo ra JSON hơi khác nhau trong các công cụ khác nhau.
Làm thế nào để xử lý các tệp XML lớn?
Các công cụ chạy trên trình duyệt hoạt động tốt với tệp dưới vài megabyte. Với tệp lớn hơn (10MB+), hãy dùng trình phân tích streaming như iterparse của Python (xml.etree.ElementTree) hoặc xml-stream của Node.js. Các công cụ này xử lý tài liệu theo từng phần mà không cần nạp toàn bộ cây vào bộ nhớ.