使用CDATA存储原始二进制流?

时间:2009-02-02 11:04:00

标签: xml binary base64 cdata

而不是saving binary as Base64的开销,我想知道你是否可以直接将双字节二进制流存储到XML文件中,使用CDATA,或者将其注释掉,或者什么?

4 个答案:

答案 0 :(得分:11)

Nul字符(C中的'\ 0')在XML中的任何地方都无效,即使是作为转义符(�)。

答案 1 :(得分:9)

不,你不能单独使用CDATA在XML文件中注入二进制数据。

在XML1.0中(因为XML 1.1更宽松,但不是控制字符),以下限制适用于CDATA字符:

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

这意味着有几个字符是非法的,其中包括:

  • 非法XML控制字符0x00到0x20,除了新行,回车和制表符
  • 非法UTF-8序列,如0xFF或非规范0b1100000x 0b10xxxxxx

除此之外,在没有CDATA的标准实体内容中:

  • “<”和“>”使用是非法的
  • “&安培;”限制使用(é没问题,&zajdalkdza;不是)

所以CDATA只是一种允许“<”,“>”的方式和“&”,通过限制“]]>”代替。它没有解决非法的XML,Unicode和UTF-8字符问题,这是主要问题。

解决方案:

  1. 使用 Base64 ,只需33%的开销,但在所有编程语言中都有大量支持,而且这是标准的
  2. 使用 BaseXML 但仍然有限的实施,但只有20%的开销
  3. 如果可能,请不要在XML中编码二进制数据,单独传输

答案 2 :(得分:4)

XML是纯文本格式 - 不要用它来存储二进制数据。将二进制blob放在单独的文件中,并在XML中添加一个引用这些文件的元素。如果要将所有二进制blob存储在单个文件中,请添加偏移属性或类似的内容......

答案 3 :(得分:-1)

您可以将其存储为CDATA,但存在一些字节序列将评估为关闭CDATA部分的有效XML的风险。快速查看http://www.w3.org/TR/2006/REC-xml-20060816/#sec-cdata-sect后,您似乎可以拥有除“]]>”之外的任何字符序列。也请查看what is a valid XML char