Tất cả bài viết

XML Entities: escape ký tự trong tài liệu XML

Giống HTML, XML dùng dấu ngoặc nhọn và dấu và (&) để đánh dấu thẻ, nên các ký tự này không thể xuất hiện nguyên bản trong nội dung văn bản — tài liệu sẽ không còn hợp lệ, và khác với trình duyệt vốn "bỏ qua" HTML lỗi, trình phân tích XML dừng lại với lỗi ngay lập tức.

Năm entity bắt buộc

Khác với HTML định nghĩa hàng trăm entity có tên, đặc tả XML chỉ yêu cầu năm entity:

  • &lt; — thay cho <
  • &gt; — thay cho >
  • &amp; — thay cho &
  • &apos; — thay cho dấu nháy đơn '
  • &quot; — thay cho dấu nháy kép "

Dấu nháy chỉ bắt buộc phải escape bên trong giá trị thuộc tính, còn <& phải được escape ở bất kỳ đâu trong nội dung văn bản.

Ứng dụng thực tế

Hóa đơn điện tử tại Việt Nam theo quy định của cơ quan thuế được xuất dưới dạng XML, và tên công ty chứa dấu & — ví dụ "Công ty Anh & Em" — sẽ khiến toàn bộ hóa đơn không hợp lệ nếu không được escape. Vấn đề tương tự xảy ra với RSS feed của các trang tin tức: một tiêu đề bài viết chứa & chưa escape đủ để làm hỏng toàn bộ feed đối với người đọc.

Vì sao XML nghiêm ngặt hơn HTML

Trình duyệt thường "bỏ qua" HTML sai định dạng và vẫn cố hiển thị trang bất chấp lỗi. Trình phân tích XML thì không — chỉ một dấu & hoặc ngoặc nhọn chưa escape cũng khiến toàn bộ tài liệu không hợp lệ, và quá trình xử lý dừng lại với lỗi.

Khi nào cần dùng

  • Chuẩn bị văn bản do người dùng nhập trước khi chèn vào tài liệu XML (feed, file cấu hình, thông điệp SOAP).
  • Gỡ lỗi: xem văn bản gốc ẩn sau các entity trong một XML nhận được.
  • Chỉnh sửa file XML thủ công mà không làm hỏng cấu trúc tài liệu.

Giải pháp thay thế entity: khối CDATA

Khi một khối văn bản chứa nhiều ký tự đặc biệt — chẳng hạn đoạn HTML hoặc code nhúng trong XML — sẽ tiện hơn nếu bọc nó trong <![CDATA[...]]>, nơi <& không cần escape và được xem như văn bản thuần. Ngoại lệ duy nhất là chuỗi ]]>, vì nó đóng khối CDATA nên không thể xuất hiện bên trong nội dung của chính khối đó.

Dùng thử công cụ