7

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

4

4 回答 4

13

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

于 2009-02-02T11:07:14.447 回答
13

不,您不能单独使用 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 中编码二进制数据,单独传输
于 2013-07-05T09:35:35.127 回答
4

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

于 2009-02-02T11:27:48.257 回答
-1

您可以将其存储为 CDATA,但存在某些字节序列将评估为关闭 CDATA 部分的有效 XML 的风险。快速浏览http://www.w3.org/TR/2006/REC-xml-20060816/#sec-cdata-sect后,您似乎可以使用除“]]>”之外的任何字符序列。看看什么是有效的 XML 字符

于 2009-02-02T11:09:23.927 回答