Tiếng Việt

Công cụ dành cho nhà phát triển · Trình chuyển đổi cú pháp

Ánh xạ XML tới JSON: thuộc tính, nút văn bản và vấn đề một đấu nhiều

· Cách thức hoạt động

xml json data-formats

Một mục XML ánh xạ tới một đối tượng trong khi các mục lặp lại ánh xạ tới một mảng
Hình minh họa vector ToolAcre gốc

Không có một cách chính xác duy nhất nào để biến XML thành JSON, bởi vì XML có các thuộc tính, nội dung hỗn hợp và các phần tử con có thứ tự mà JSON thiếu. Bài đăng này giải thích các quy ước lập bản đồ phổ biến và các bẫy trong mỗi quy ước.

Tại sao một <item> trở thành đối tượng và hai trở thành một mảng — nguồn cấp dữ liệu XML có hình dạng JSON thay đổi tùy thuộc vào số lượng mục nhập của nó

Nguồn cấp dữ liệu có `<item>one</item>` tạo ra `"item": "one"`; việc thêm anh chị em thứ hai sẽ thay đổi thuộc tính đó thành `"item": ["one", "two"]`. Trình phân tích cú pháp không thể suy ra rằng một mục về mặt khái niệm là danh sách một mục vì cả hai nghĩa đều có cú pháp XML giống hệt nhau. Do đó, mã chỉ được xây dựng dựa trên mẫu đầu tiên có thể bị lỗi khi quá trình sản xuất gửi mẫu thứ hai.

ToolAcre không che giấu sự bất ổn này đằng sau tùy chọn luôn có mảng. Nó ghi lại tên một lần dưới dạng một giá trị và các tên anh chị em lặp lại dưới dạng một mảng. Ánh xạ trực tiếp đó rất dễ kiểm tra, nhưng người tiêu dùng cần hình dạng bộ sưu tập ổn định phải sử dụng kiến ​​thức lược đồ hoặc tự chuẩn hóa kết quả sau khi chuyển đổi.

Những gì XML có mà JSON không có — thuộc tính, văn bản được trộn lẫn với các phần tử, thứ tự anh em, không gian tên, nhận xét và hướng dẫn xử lý

XML tách các thuộc tính khỏi các phần tử con, giữ nguyên thứ tự anh em, cho phép văn bản giữa các phần tử, mang tiền tố không gian tên và có thể chứa các nhận xét và hướng dẫn xử lý. JSON cung cấp các đối tượng và mảng nhưng không có các đối tượng tương đương được tích hợp sẵn cho các danh mục nút đó. Do đó, mọi kết quả XML-to-JSON đều là phép chiếu được chọn chứ không phải là bản dịch phổ quát.

Người đọc này bỏ phần khai báo, nhận xét và hướng dẫn xử lý. Tiền tố không gian tên giữ nguyên nguyên văn thay vì được giải quyết: `<ns:item>` trở thành khóa `ns:item`, trong khi `xmlns:ns` trở thành `@xmlns:ns`. Văn bản hỗn hợp được nối dưới một phím, do đó vị trí ban đầu của nó xung quanh các phần tử con bị mất và cảnh báo cho biết quá trình chuyển đổi không thể khứ hồi.

Quy ước thuộc tính - các tiền tố như @ hoặc $, lý do chúng tồn tại và cách một thuộc tính và phần tử con có cùng tên va chạm với nhau

Các thuộc tính sử dụng tiền tố `@`. `<user id="7"><id>other</id></user>` trở thành đối tượng có `@id` bằng `"7"` và con `id` bằng `"other"`. Tiền tố ngăn hai cấu trúc XML khác nhau va chạm trong một thuộc tính đối tượng. Nó cũng trở thành một phần trong hợp đồng của người chuyển đổi khi JSON được ghi lại thành XML.

Các thư viện khác có thể sử dụng `$`, một đối tượng thuộc tính hoặc một quy ước khác. ToolAcre chỉ hỗ trợ ánh xạ `@` hiển thị. Việc thay đổi tiền tố đó trong mã ứng dụng mà không thay đổi người viết sẽ biến các thuộc tính thành các phần tử, vì vậy hãy giữ nguyên nó khi sử dụng giá trị được chuyển đổi làm biểu mẫu kiểm tra trung gian.

Quy ước nút văn bản - #text hoặc _ cho nội dung phần tử và điều gì xảy ra khi một phần tử có cả văn bản và phần tử con

Một phần tử chỉ chứa văn bản sẽ thu gọn thành chuỗi đó. Khi các thuộc tính hoặc thuộc tính con cũng xuất hiện, văn bản sẽ nằm trong `#text`; CDATA được lưu giữ riêng biệt dưới `#cdata`. Thẻ tự đóng sẽ trở thành một chuỗi trống. Các khóa dành riêng này cho phép người viết phân biệt tên con thông thường với các danh mục nội dung mà bản thân JSON không xác định.

Nội dung hỗn hợp vẫn bị mất. Trong `<p>before<b>bold</b>after</p>`, vị trí “trước” và “sau” liên quan đến thành phần con không thể được xây dựng lại từ thuộc tính `#text` đã tham gia. Công cụ này phát hiện mô hình cấu trúc đó và cảnh báo. Sử dụng tính năng bảo toàn nút XML API khi thứ tự tài liệu là một phần ý nghĩa.

Vấn đề một đấu nhiều - các phần tử lặp lại chỉ trở thành mảng khi được lặp lại và tại sao người tiêu dùng phải viết mã phòng thủ

Anh chị em lặp đi lặp lại chỉ biến thành mảng sau khi quan sát thấy sự lặp lại. Một `<book>` là một đối tượng; hai cuốn sách là một mảng các đối tượng. Điều này đôi khi được gọi là vấn đề một chọi nhiều, nhưng nó không phải là lỗi của trình phân tích cú pháp. Tài liệu nguồn đơn giản là không chứa phần khai báo danh sách độc lập với các lần xuất hiện của nó.

Người tiêu dùng phòng thủ có thể bình thường hóa các đường dẫn đã biết bằng kiến ​​thức về lược đồ: bọc `catalogue.book` khi nó chưa phải là một mảng. Đừng áp dụng quy tắc đó cho mọi thuộc tính, vì một đại lượng vô hướng thông thường không nên trở thành một danh sách chỉ mang tính đối xứng. Trình chuyển đổi cố tình tránh phát minh ra thông tin tên miền như vậy.

Ví dụ đã thực hiện: chuyển đổi một tài liệu kiểu RSS nhỏ — thuộc tính, phần tử lặp lại và vùng tên, với kết quả là JSON được chú thích

Chuyển đổi `<feed xmlns:m="https://example.invalid/meta"><item id="1"><m:title>One</m:title></item><item id="2"><m:title><![CDATA[Two & More]]></m:title></item></feed>`. Gốc là `feed`; `@xmlns:m` giữ lại khai báo vùng tên; `item` là một mảng; mỗi `@id` là văn bản; và tiêu đề thứ hai chứa `#cdata`.

Theo mặc định, suy luận loại bị tắt nên ngay cả `id="2"` vẫn giữ nguyên chuỗi `"2"`. Việc bật suy luận cho phép trình phân tích cú pháp đọc văn bản số và Boolean dưới dạng các loại JavaScript đó, nhưng XML không khai báo ý định đó. Tùy chọn này là sự phỏng đoán do người dùng kiểm soát chứ không phải bằng chứng do tài liệu cung cấp.

Điều này không bao gồm những gì - chuyển đổi dựa trên lược đồ biết một phần tử luôn là một danh sách, yêu cầu XSD hoặc ánh xạ thủ công

Không có XSD nào được tải và không có sẵn thông tin danh sách dựa trên lược đồ. Trình chuyển đổi không thể biết rằng một phần tử có thể lặp lại khi chỉ có một phần tử xuất hiện, xác thực các phần tử con được yêu cầu, phân giải các URI không gian tên thành các loại ứng dụng hoặc tạo một máy khách đã nhập. Phân tích cú pháp thành công chỉ thiết lập XML đúng định dạng được trình đọc được định cấu hình chấp nhận.

Các khai báo DOCTYPE bị từ chối trước khi phân tích cú pháp, kể cả những khai báo vô hại. Ranh giới đó ngăn cản các yêu cầu thực thể bên ngoài, việc đọc tệp cục bộ và mở rộng thực thể. Việc xóa DOCTYPE cũng có thể xóa các phần khai báo mà tài liệu phụ thuộc vào, vì vậy, chỉ thực hiện việc đó khi bạn sở hữu dữ liệu và hiểu rõ hậu quả.

Bài học rút ra: XML tới JSON là một ánh xạ, không phải là bản dịch — và cách bảng điều khiển Trình chuyển đổi cú pháp cho phép bạn kiểm tra ánh xạ đó trong trình duyệt của mình

Xử lý kết quả dưới dạng ánh xạ tài liệu của ToolAcre: `@` cho các thuộc tính, `#text` cho văn bản phần tử hỗn hợp, `#cdata` cho CDATA, các mảng sau các anh chị em lặp lại và tiền tố không gian tên theo nghĩa đen. Những quy tắc đó làm cho kết quả có thể dự đoán được mà không cần giả vờ XML và JSON chia sẻ một mô hình dữ liệu.

Để kiểm tra, phép chiếu này nhanh và dễ đọc. Để tích hợp lâu dài, hãy kiểm tra một và nhiều lần xuất hiện, thuộc tính chia sẻ tên với phần tử con, phần tử trống, nội dung hỗn hợp và không gian tên. Nếu thứ tự phần tử hoặc các ràng buộc lược đồ quan trọng, hãy phân tích cú pháp XML theo hợp đồng đó thay vì phụ thuộc vào hình dạng được chuyển đổi chung.

Giữ cố định XML thô bên cạnh kỳ vọng đã chuẩn hóa. Việc ghép nối đó sẽ lưu giữ bằng chứng nếu bản nâng cấp phụ thuộc thay đổi cách xử lý mảng, cắt bớt khoảng trắng hoặc giải mã thực thể. Nó cũng cung cấp cho người đánh giá một nơi để thấy được sự khác biệt mà chế độ xem JSON không thể mang lại. Chỉ một đối tượng được chuyển đổi không thể chứng minh liệu một chuỗi trống có đến từ phần tử tự đóng, các thẻ được ghép nối hay một quy ước khác trong nguồn hay không.