Bộ chuyển đổi XML sang JSON
Dán XML bên trái, nhận JSON bên phải. Thuộc tính được giữ với tiền tố @_. Chạy trong trình duyệt — không tải lên.
- Dán XML vào vùng văn bản bên trái.
- Bấm "Chuyển sang JSON". Phép lồng phần tử trở thành đối tượng lồng nhau.
- Sao chép JSON, hoặc tải xuống dưới dạng data.json.
- Các phần tử con lặp lại tự động được gộp thành mảng.
Công cụ này làm gì?
Phân tích XML thành đối tượng JSON theo quy ước fast-xml-parser: phần tử con trở thành thuộc tính đối tượng, con lặp lại trở thành mảng, thuộc tính được giữ với tiền tố `@_` trên đối tượng cha, và nội dung văn bản của các nút hỗn hợp đáp xuống khóa `#text`. Giá trị thuộc tính số và boolean được tự động định kiểu qua `parseAttributeValue: true` — XML `count="42"` đi vòng như `"@_count": 42`, không phải chuỗi `"42"`.
Ví dụ
Đầu vào XML:
<root version="1">
<name>Ada</name>
<tags>math</tags>
<tags>logic</tags>
</root> Đầu ra JSON:
{
"root": {
"@_version": 1,
"name": "Ada",
"tags": ["math", "logic"]
}
} Cạm bẫy XML thường gặp và cách xử lý
XML có những trường hợp ngóc ngách mà JSON không có. Đây là những mẫu tạo ra đầu ra bất ngờ.
- Một con vs. nhiều con. `<a><b/></a>` tạo ra `{"a":{"b":""}}` (con duy nhất là thuộc tính đối tượng), nhưng `<a><b/><b/></a>` tạo ra `{"a":{"b":["",""]}}` (nhiều là mảng). Nếu mã hạ nguồn của bạn luôn mong đợi mảng, hãy chuẩn hóa sau khi chuyển đổi.
- Thuộc tính vs. phần tử con. Thuộc tính xuất hiện với tiền tố `@_` ở cùng cấp với con. `<user id="1"><name>Ada</name></user>` trở thành `{"user":{"@_id":1,"name":"Ada"}}`. Một số công cụ trộn thuộc tính vào thuộc tính — đó là quy ước khác với quy ước được dùng ở đây.
- Nội dung hỗn hợp (văn bản + phần tử con). `<p>Hello <b>world</b></p>` tạo ra `{"p":{"#text":"Hello ","b":"world"}}`. Văn bản được bắt nhưng vị trí của nó so với các con bị mất — JSON không có cách biểu diễn nội dung hỗn hợp có thứ tự. Hầu hết XML kiểu cấu hình không gặp trường hợp này.
- Không gian tên. Không gian tên (`<x:foo xmlns:x="...">`) được giữ như một phần của tên phần tử (`x:foo`). Nhiều người tiêu thụ XML tước bỏ tiền tố; nếu cần, hãy làm như một bước hậu xử lý.
- Phần CDATA. `<![CDATA[some text]]>` được phân tích như văn bản thuần và nối vào `#text` của cha. Khung CDATA bị mất — ổn cho hầu hết trường hợp nhưng đáng lưu ý nếu khung có ý nghĩa ngữ nghĩa.
- Tự đóng vs. rỗng. `<x/>` và `<x></x>` tương đương trong XML và tạo ra cùng đầu ra JSON (`""` cho giá trị). Khung gốc không thể khôi phục từ JSON.
Câu hỏi thường gặp
Tại sao đầu ra của tôi có tiền tố `@_` trên thuộc tính?
Nó phân biệt thuộc tính XML với phần tử con. Không có tiền tố, `<user id="1"><id>foo</id></user>` sẽ có hai khóa `id` — một đối tượng JSON chỉ có thể có một. Tiền tố giữ cả hai có thể đi vòng. Nếu bạn không cần tiền tố, thay `"@_"` bằng `""` trong bước hậu xử lý (và chấp nhận rủi ro xung đột).
Tôi có thể lấy JSON mà không có khóa gốc bao quanh không?
XML luôn có một phần tử gốc duy nhất. JSON giữ vỏ bọc đó để có thể đi vòng. Loại bỏ sau khi chuyển đổi nếu bạn muốn đối tượng bên trong — `result.root` thay vì `result`.
Bình luận XML có được giữ không?
Không. JSON không có cú pháp bình luận, và bộ phân tích được cấu hình để bỏ qua bình luận XML. Nếu bạn cần giữ bình luận, bạn phải dùng biểu diễn trung gian khác hỗ trợ chúng.
Giá trị thuộc tính có được định kiểu không?
Có — `parseAttributeValue: true` được đặt, vì thế `count="42"` trở thành `"@_count": 42` (số) và `enabled="true"` trở thành `"@_enabled": true` (boolean). Nếu bạn cần thuộc tính dưới dạng chuỗi, hậu xử lý hoặc fork cấu hình.
XML của tôi có được tải lên không?
Không. Mọi thứ chạy trong trình duyệt của bạn — XML được phân tích bởi JavaScript trên trang này và không bao giờ gửi đến máy chủ. Xác nhận trong công cụ phát triển của trình duyệt.
Có thể xử lý tệp XML rất lớn không?
Đến khoảng 30 MB trước khi textarea chậm lại. Bộ phân tích tỷ lệ tuyến tính. Đối với đầu vào lớn hơn, chạy fast-xml-parser trên dòng lệnh — cùng thư viện.