2012-02-27 76 views
7

thể trùng lặp:
Why are “control” characters illegal in XML?
Saving an escape character 0x1b in an XML fileTại sao trình nối tiếp XML ném ngoại lệ ký tự không hợp lệ khi ký tự nằm trong CDATA?

này ném một ArgumentException:

var c = '\x1A'; 

    var xml = new XDocument(
       new XDeclaration("1.0", "utf-8", null), 
       new XElement("test", new XCData(c.ToString())) 
      ); 

    var foo = xml.ToString(); // ArgumentException 

Tại sao Net ném ngoại lệ này? Tôi đang gói các nhân vật bất hợp pháp trong CDATA, vì vậy tôi đã nghĩ rằng các nhân vật bất hợp pháp sẽ được xử lý cho tôi. Đây cũng là trường hợp cho một loạt các ký tự khác (ví dụ: 0x1B, 0x1C, 0x1E, 0x1E, 0x1F).

Bạn giải quyết vấn đề này như thế nào?

+4

Xem các câu hỏi sau: [Lưu ký tự thoát 0x1b trong tệp XML] (http://stackoverflow.com/questions/4134438/saving-an-escape-character-0x1b-in-an-xml-file) và [Tại sao các ký tự "điều khiển" bất hợp pháp trong XML?] (Http://stackoverflow.com/questions/404107/why-are-control-characters-lang-in-xml). Workaraund sẽ sử dụng mã hóa Base64 trước khi lưu vào một XML. – oleksii

+0

@oleksii Bạn nên biến câu trả lời này thành câu trả lời, vì đó là câu trả lời chính xác. – Bevan

+0

@Bevan: Không, thực sự câu hỏi sẽ bị đóng là trùng lặp. –

Trả lời

0

Tôi không nghĩ SecurityElement.Escape sẽ hoạt động vì \ x1A là mã kiểm soát - không có thực thể xml hợp lệ để thay thế.

Xem chi tiết list of valid XML characters để biết thêm chi tiết hơn một chút.

-1

Thử lưu trữ dữ liệu xml của bạn dưới dạng dữ liệu đã thoát bằng cách sử dụng SecurityElement từ không gian tên System.Security. Xem thêm thông tin có thể được tìm thấy here

string xmlData = SecurityElement.Escape(xmlData); 

ký tự XML không hợp lệ có thể được viết bằng cách tạo ra các XDocument với XmlWriterSettings thiết lập với tài sản thiết lập để sai CheckCharacters. Điều này sau đó sẽ thay thế chúng bằng ký tự số như & # 0; - & # 0x1F. Xem this bài viết để biết thêm chi tiết. Ngoài ra, bạn có thể gọi một số phương pháp dọn dẹp xml như this one.

+0

Điều đó không hiệu quả. Tôi vẫn nhận được một ArgumentException cho ký tự \ x1A ngay cả sau khi sử dụng SecurityElement.Escape. –

+0

bạn có thể vui lòng cho biết cách bạn sử dụng nó trong ngữ cảnh của bạn –

+1

Các ký tự điều khiển không được phép trong XML cho dù là gì đi chăng nữa. –

Các vấn đề liên quan