 XML通常是用来描述文本数据的方法,例如元素本身给出文本的名称,而元素的内容通常是基于文本的。然而有时候你也会遇到想将非文本的数据放到XML文档中的情况。让我们检查一下你可能使用的几种方法。
问题
你可能想你只需要放置一些二进制数据到开始和结束标签里面就万事大吉了,不幸的是这可能导致几个潜在的问题:
- XML中的新行符和空格字符将搞乱二进制数据。
- 二进制数据可能包含null字符。
- 二进制数据可能包含“</”序列。
这些问题既影响二进制数据也影响XML解析。如果解析器不能决定如何继续,你就不能提取任何数据。如果解析器“格式化”数据,那么你就不能正确的处理那些二进制数据。
解决方案
解决这个问题至少有三种方案:
- 使用CDATA 标签直接将二进制数据嵌入XML文档。
- 使用URL引用二进制数据。
- 将二进制数据编码为基于文本的格式然后再设置为XML元素的内容。
二进制嵌入
这个解决方案允许你直接将二进制数据放到XML文档中。使用这个方法,你不用从一个远程系统取一个文件或者在使用前解码,数据可以马上处理。
要使用这个方法,使用XML的CDATA标签,它是一个特殊的标签,用于处理那些在XML解析期间不能被解析的数据。基本上,你使用一个开始标签和一个结束标签表示二进制数据的开始和结束位置就可以了。包含在CDATA中的元素值将成为二进制数据,例如:
<Product>
<SKU>99238</SKU>
<Description>Super Gidgetidoo</Description>
<Picture>
<![CDATA[q???????????T???]]>
</Picture>
</Product>
就像你看到的那样,
CDATA标签使用序列“<![CDATA[”作为开始标签并使用“]]>”作为结束标签。XML解析器忽略标签之间的所有数据。
不幸的是,这个方法有一些问题。首先,你可能遇到XML文档、解析器和你的二进制数据使用的字符集的问题。其次,你的二进制数据可能包含“]]>”序列,这会使得XML解析器以为它是不用解析数据的结束,虽然它实际不是二进制数据的结尾,这是非常麻烦的情况。
|