Tôi đang phân tích cú pháp một tệp XML bằng Sax Parser của Xerces.
Có <?xml version="1.0" encoding="UTF-8"?>
cần khai báo XML không?
Tôi đang phân tích cú pháp một tệp XML bằng Sax Parser của Xerces.
Có <?xml version="1.0" encoding="UTF-8"?>
cần khai báo XML không?
Câu trả lời:
Trong XML 1.0, Tuyên bố XML là tùy chọn . Xem phần 2.8 của Khuyến nghị XML 1.0 , trong đó nó nói rằng nó "nên" được sử dụng - có nghĩa là nó được khuyến nghị, nhưng không bắt buộc. Tuy nhiên, trong XML 1.1, việc khai báo là bắt buộc . Xem phần 2.8 của Khuyến nghị XML 1.1 , trong đó nó nói "PHẢI" được sử dụng. Nó thậm chí còn tuyên bố rằng nếu không có khai báo, điều đó tự động ngụ ý rằng tài liệu là một tài liệu XML 1.0.
Lưu ý rằng trong một khai báo XML sự encoding
và standalone
cả hai đều không bắt buộc. Chỉ có version
là bắt buộc. Ngoài ra, đây không phải là các thuộc tính, vì vậy nếu chúng có mặt thì chúng phải theo thứ tự version
đó:, theo sau là bất kỳ encoding
, theo sau là bất kỳ standalone
.
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" standalone="yes"?>
<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
Nếu bạn không chỉ định mã hóa theo cách này, trình phân tích cú pháp XML sẽ cố gắng đoán mã hóa nào đang được sử dụng. Khuyến nghị XML 1.0 mô tả một cách khả thi có thể tự động phát hiện mã hóa ký tự . Trong thực tế, điều này không có nhiều vấn đề nếu đầu vào được mã hóa là UTF-8, UTF-16 hoặc US-ASCII. Tính năng tự động phát hiện không hoạt động khi nó gặp các mã hóa 8 bit sử dụng các ký tự bên ngoài phạm vi US-ASCII (ví dụ: ISO 8859-1) - hãy tránh tạo các mã này nếu bạn có thể.
Dấu standalone
cho biết liệu tài liệu XML có thể được xử lý chính xác mà không cần DTD hay không. Mọi người ít sử dụng nó. Ngày nay, thật tệ khi thiết kế một định dạng XML thiếu thông tin mà không có DTD của nó.
Cập nhật:
Lỗi "lỗi prolog / mã hóa utf-8 không hợp lệ" chỉ ra rằng dữ liệu thực tế mà trình phân tích cú pháp tìm thấy bên trong tệp không khớp với kiểu mã hóa mà khai báo XML cho biết. Hoặc trong một số trường hợp, dữ liệu bên trong tệp không khớp với mã hóa được phát hiện tự động.
Vì tệp của bạn chứa dấu thứ tự byte (BOM) nên tệp phải ở dạng mã hóa UTF-16. Tôi nghi ngờ rằng tuyên bố của bạn cho biết <?xml version="1.0" encoding="UTF-8"?>
rõ ràng là không chính xác khi tệp đã được NotePad thay đổi thành UTF-16. Giải pháp đơn giản là loại bỏencoding
và đơn giản nói <?xml version="1.0"?>
. Bạn cũng có thể chỉnh sửa nó để nói encoding="UTF-16"
nhưng điều đó sẽ sai đối với tệp gốc (không có trong UTF-16) hoặc nếu tệp bằng cách nào đó được thay đổi trở lại UTF-8 hoặc một số mã hóa khác.
Đừng bận tâm đến việc loại bỏ BOM - đó không phải là nguyên nhân của vấn đề. Sử dụng NotePad hoặc WordPad để chỉnh sửa XML là một vấn đề thực sự!
Khai báo Xml là tùy chọn để xml của bạn được định dạng tốt mà không cần nó. Nhưng chúng tôi khuyên bạn nên sử dụng nó để người phân tích cú pháp không đưa ra các giả định sai, cụ thể là về cách mã hóa được sử dụng.