我有两个用Java编写的应用程序,它们通过网络使用XML消息相互通信.我在接收端使用SAX解析器从消息中取出数据.其中一个要求是将二进制数据嵌入XML消息中,但SAX不喜欢这样.有谁知道如何做到这一点?
更新:我使用apache commons编解码器库中的Base64类,以防其他人尝试类似的东西.
您可以使用base64对二进制数据进行编码,并将其放入Base64元素中; 以下文章是关于这个主题的非常好的文章.
处理XML文档中的二进制数据
XML是如此多才多艺......
0 0 1 ...1
XML就像暴力 - 如果它不能解决您的问题,那么您就没有使用它.
编辑:
BTW:Base64 + CDATA可能是最好的解决方案
(编辑方式2:
无论是谁给我打电话,也请提出真正的答案.我们不希望任何可怜的灵魂来到这里并实际实施我的方法,因为它在SO上排名最高,对吗?)
Base64确实是正确的答案,但CDATA不是,基本上说:"这可能是任何东西",但它不能只是任何东西,它必须是Base64编码的二进制数据.XML Schema将Base 64二进制文件定义为可在xsd中使用的基本数据类型.
上周我遇到了这个问题.我不得不序列化一个PDF文件并将其在XML文件中发送到服务器.
如果您使用的是.NET,则可以将二进制文件直接转换为base64字符串并将其粘贴到XML元素中.
string base64 = Convert.ToBase64String(File.ReadAllBytes(fileName));
或者,在XmlWriter对象中内置了一个方法.在我的特定情况下,我必须包含Microsoft的数据类型名称空间:
StringBuilder sb = new StringBuilder(); System.Xml.XmlWriter xw = XmlWriter.Create(sb); xw.WriteStartElement("doc"); xw.WriteStartElement("serialized_binary"); xw.WriteAttributeString("types", "dt", "urn:schemas-microsoft-com:datatypes", "bin.base64"); byte[] b = File.ReadAllBytes(fileName); xw.WriteBase64(b, 0, b.Length); xw.WriteEndElement(); xw.WriteEndElement(); string abc = sb.ToString();
字符串abc看起来像这样:
JVBERi0xLjMKJaqrrK0KNCAwIG9iago8PCAvVHlwZSAvSW5mbw...(plus lots more)
我通常使用MIME Base64或URL编码对二进制数据进行编码.
尝试Base64编码/解码二进制数据.另请参阅CDATA部分