2009-02-02 25 views

Trả lời

-1

Bạn có thể lưu trữ dưới dạng CDATA, nhưng có nguy cơ một số chuỗi byte sẽ đánh giá thành XML hợp lệ đóng phần CDATA. Sau khi xem nhanh http://www.w3.org/TR/2006/REC-xml-20060816/#sec-cdata-sect, có vẻ như bạn có thể có bất kỳ chuỗi ký tự nào ngoại trừ "]]>". Có một cái nhìn tại what is a valid XML char quá.

+1

Điều đó có nghĩa là không bạn không thể, vì 0-8, B, C, E, F FFFE và FFFF là các ký tự không hợp lệ? –

+0

Downvoting vì có nhiều chuỗi byte sẽ không được bảo tồn. Bởi "không bảo quản", tôi có nghĩa là không thể phục hồi dữ liệu nhị phân ban đầu từ dữ liệu được mã hóa CDATA. Xem câu trả lời và nhận xét của Pete. – rwong

+0

nó nguy hiểm hơn nhiều so với bạn đề xuất ở đây. Xem câu trả lời của pete ... – Phil

11

Ký tự Nul ('\ 0' trong C) không hợp lệ ở bất kỳ đâu trong XML, ngay cả khi thoát (& # 0;).

+0

Tôi cho rằng vì các tệp XML bị vô hiệu. –

+2

@ Jeremy: Không phải. Null không chỉ là một ký tự XML hợp lệ, có khả năng là do các chuỗi được kết thúc bằng null trong một ngôn ngữ lập trình phổ biến ... – Christoph

+0

Lưu ý rằng tiêu chuẩn không rõ 100% về điều này.Các định nghĩa phạm vi ký tự loại trừ 0 byte nhưng một số văn bản khác nói rằng bất kỳ ký tự nào dưới 127 đều hợp lệ. –

4

XML là định dạng thuần văn bản - không sử dụng định dạng này để lưu trữ dữ liệu nhị phân. Đặt các đốm màu nhị phân trong các tệp riêng biệt và thêm phần tử vào XML của bạn tham chiếu các tệp này. Nếu bạn muốn lưu trữ tất cả các đốm màu nhị phân trong một tệp, hãy thêm thuộc tính offset hoặc một cái gì đó tương tự ...

+0

Vâng, và chính xác Flash phải kết nối và đọc các tệp nhị phân thô như thế nào? (Chỉ dành cho ActionScript 2) –

+0

Đừng cho tôi nói chuyện ByteArray hoặc URLLoader. Đây chỉ là AS2. –

+2

@Jeremy: và bạn đã nói chính xác điều đó ở đâu trong câu hỏi của bạn? – Christoph

7

Không, bạn không thể sử dụng riêng CDATA để chèn dữ liệu nhị phân vào tệp XML.

Trong XML1.0 (vì XML 1.1 là dễ dãi hơn, nhưng không phải về ký tự điều khiển), các hạn chế sau áp dụng cho CDATA nhân vật:

CData  ::=  (Char* - (Char* ']]>' Char*)) 
Char  ::=  #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] 

Điều đó có nghĩa có một số nhân vật bất hợp pháp, trong đó bao gồm:

  • bất hợp pháp ký tự điều khiển XML 0x00 đến 0x20 trừ dòng mới, kí tự xuống dòng và các tab
  • bất hợp pháp UTF-8 chuỗi như 0xFF hoặc phi kinh điển 0b1100000x 0b10xxxxxx
  • 012.

Bên cạnh đó, trong một nội dung tổ chức tiêu chuẩn mà không CDATA:

  • "<" và ">" sử dụng là bất hợp pháp
  • "&" sử dụng bị hạn chế (&eacute; là OK, &zajdalkdza; là không)

Vì vậy CDATA chỉ là một cách để cho phép "<", ">" và "&", bằng cách hạn chế "]]>" để thay thế. Nó không giải quyết vấn đề XML, Unicode và UTF-8 bất hợp pháp mà là vấn đề chính.

Giải pháp:

  1. Sử dụng Base64 với 33% chi phí nhưng một sự hỗ trợ lớn trong tất cả các ngôn ngữ lập trình và thực tế rằng đó là một tiêu chuẩn
  2. Sử dụng BaseXML với việc triển khai vẫn còn hạn chế nhưng 20% ​​chi phí chỉ
  3. Không mã hóa dữ liệu nhị phân trong XML nếu có thể, chuyển nó một cách riêng biệt
Các vấn đề liên quan