2009-02-02 55 views

回答

11

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

+0

我想是因为XML文件是空终止的。 – 2009-02-02 11:12:04

+2

@杰瑞米:他们不是。 Null不是一个有效的XML字符,可能是因为流行编程语言中以空字符结尾的字符串... – Christoph 2009-02-02 11:34:35

+0

请注意,该标准并非100%清楚。字符范围定义不包括0字节,但其他一些文本则说任何低于127的字符都是有效的。 – 2009-02-02 12:29:31

4

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

7

不,您不能单独使用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标准的实体内容:

  • “<” 和 “>” 的使用是非法
  • “&” 的使用受到限制(&eacute;是确定的,&zajdalkdza;是不)

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

解决方案:

  1. 使用Base64有33%的开销,但在所有的编程语言大的支持,事实上,这是一个标准的
  2. 使用BaseXML与仍然有限实现,但20%的开销只有
  3. 如果可能,请勿在XML中编码二进制数据,将其单独传输