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

Rob*_*cks 7 xml binary base64 cdata

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

Pet*_*ham 12

Nul字符(C中的'\ 0')在XML中的任何位置都无效,即使是转义(�).

  • @Jeremy:他们不是.Null只是一个有效的XML字符,可能是因为流行的编程语言中以空字符结尾的字符串... (2认同)

Kri*_*Dev 11

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

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

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

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

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

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

  • "<"和">"使用是非法的
  • "&"使用受到限制(&eacute;可以,&zajdalkdza;不是)

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

解决方案:

  1. 使用Base64有33%的开销,但在所有编程语言中都有很大的支持,并且它是标准的事实
  2. 使用仍然有限的实现BaseXML,但仅限20%的开销
  3. 如果可能,请勿在XML中编码二进制数据,请单独传输


Chr*_*oph 5

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

  • @Jeremy:您在问题中到底在哪里陈述了这一点? (2认同)

Joa*_*lva -1

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

  • 这是否意味着不可以,因为 0-8、B、C、E、F FFFE 和 FFFF 是无效字符? (2认同)