Nếu không có dữ liệu hoặc nguồn thực tế của bạn, chúng tôi sẽ khó chẩn đoán điều gì đang xảy ra. Tuy nhiên, tôi có thể đưa ra một vài đề xuất:
- Unicode NUL (0x00) là bất hợp pháp trong tất cả các phiên bản của XML và trình phân tích cú pháp xác thực phải từ chối đầu vào chứa nó.
- Bất chấp những điều trên; XML không được xác thực trong thế giới thực có thể chứa bất kỳ loại byte rác nào có thể tưởng tượng được.
- XML 1.1 cho phép các ký tự điều khiển không có độ rộng và không in (ngoại trừ NUL), vì vậy bạn không thể xem tệp XML 1.1 trong trình soạn thảo văn bản và biết nó chứa những ký tự nào.
Với những gì bạn đã viết, tôi nghi ngờ rằng bất cứ điều gì chuyển đổi dữ liệu cơ sở dữ liệu sang XML đều bị hỏng; nó truyền các ký tự không phải XML.
Tạo một số mục nhập cơ sở dữ liệu với các ký tự không phải XML (NUL, DELs, ký tự điều khiển, v.v.) và chạy trình chuyển đổi XML của bạn trên đó. Xuất XML ra một tệp và xem nó trong một trình soạn thảo hex. Nếu điều này chứa các ký tự không phải XML, thì trình chuyển đổi của bạn đã bị hỏng. Khắc phục sự cố hoặc nếu bạn không thể, hãy tạo bộ xử lý trước từ chối đầu ra với các ký tự như vậy.
Nếu đầu ra của bộ chuyển đổi có vẻ tốt, thì vấn đề là ở người dùng XML của bạn; nó đang chèn các ký tự không phải XML vào đâu đó. Bạn sẽ phải chia quá trình tiêu thụ của mình thành các bước riêng biệt, kiểm tra kết quả đầu ra ở mỗi bước và thu hẹp những gì đang giới thiệu các ký tự xấu.
Kiểm tra mã hóa tệp (cho UTF-16)
Cập nhật:Bản thân tôi vừa gặp một ví dụ về điều này! Điều đã xảy ra là nhà sản xuất mã hóa XML thành UTF16 và người tiêu dùng đang mong đợi UTF8. Vì UTF16 sử dụng 0x00 làm byte cao cho tất cả các ký tự ASCII và UTF8 thì không, người tiêu dùng xem mỗi byte thứ hai là một NUL. Trong trường hợp của tôi, tôi có thể thay đổi mã hóa, nhưng đề xuất tất cả các tải trọng XML đều bắt đầu bằng BOM.