在XML文档中发送二进制数据cherami 翻译 (参与分:20374,专家分:5500) 发表:2003-3-21 下午2:58 版本:1.0 阅读:3505次 本文是为ZDNet翻译的系列文章之一,原文已经发表在ZDNet网站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解析器以为它是不用解析数据的结束,虽然它实际不是二进制数据的结尾,这是非常麻烦的情况。 二进制引用 可能最简单的解决方案是将二进制文件放到可以通过网络访问的服务器然后使用一个URL引用它。使用引用允许你不用担心对文件进行编码或者通过网络在XML文件中发送大文件。它也允许你动态的更新文件而不用发送一个新的XML文档。下面是一个例子: <Product> <SKU>99238</SKU> <Description>Super Gidgetidoo</Description> <Picture>http://www.mysupergidgets.com/pictures/99238.jpg</Picture></Product> 二进制编码 有少量的方法可以让你将二进制的数据编码为文本数据。基本上,这个处理使用一个相对简单的算法将二进制数据修改为ASCII字节。两个最流行的二进制编码算法是Uuencode和base64编码。 二进制编码的一个称为MIME的扩展版本用来添加文件的编码信息(例如文件名)。编码程序很容易得到,一般是作为共享软件和编程工具。下面是将一个二进制编码的文件嵌入XML文档的例子: <Product> <SKU>99238</SKU> <Description>Super Gidgetidoo</Description> <Picture>Content-Description: File encoded with ENCODE64.EXE.Content-Disposition: attachment; filename="foo.zip"Content-Transfer-Encoding: BASE64Content-Type: application/octet-streamUEsDBBQAAAAIAGtaMS2/u6RnIAAAAIYAAAAKAAAAYml0bWFwLmJtcHPybWOAADMg1gBiVihmZJAAiwcA8RE+CIaB/6iAYj4AUEsBAhQAFAAAAAgAa1oxLb+7pGcgAAAAhgAAAAoAAAAAAAAAAAAgALaBAAAAAGJpdG1hcC5ibXBQSwUGAAAAAAEAAQA4AAAASAAAAAAA </Picture></Product>