如何将二进制数据嵌入XML?
我有两个用Java编写的应用程序,它们通过网络使用XML消息相互通信。我在接收端使用了SAX解析器,以从消息中获取数据。要求之一是将二进制数据嵌入XML消息中,但是SAX不喜欢这样。有谁知道如何做到这一点?
更新:我可以通过apache commons编解码器库中的Base64类进行此操作,以防其他人尝试类似的操作。
解决方案
回答
也许将它们编码到一个已知的集合中,例如base 64是一个流行的选择。
回答
尝试对二进制数据进行Base64编码/解码。同时查看CDATA部分
回答
我们可以使用base64对二进制数据进行编码,然后将其放入Base64元素中。下面的文章是一个很好的主题。
处理XML文档中的二进制数据
回答
我通常使用MIME Base64或者URL编码对二进制数据进行编码。
回答
XML是如此多才多艺...
<DATA> <BINARY> <BIT index="0">0</BIT> <BIT index="1">0</BIT> <BIT index="2">1</BIT> ... <BIT index="n">1</BIT> </BINARY> </DATA>
XML就像暴力一样,如果不能解决问题,则说明我们使用的不够多。
编辑:
顺便说一句:Base64 + CDATA可能是最好的解决方案
(EDIT2:
谁修改我的意思,也请修改真实的答案。我们不希望任何可怜的人来这里并实际实施我的方法,因为它是SO上排名最高的,对吧?)
回答
Base64确实是正确的答案,但CDATA并非如此,这基本上是在说:"这可以是任何东西",但是它不能只是任何东西,必须是Base64编码的二进制数据。 XML Schema将Base 64二进制文件定义为可在xsd中使用的原始数据类型。
回答
我们也可以对原始二进制数据进行编码。这种格式较旧,但与base63编码具有相同的功能。
回答
任何二进制到文本的编码都可以解决问题。我用这样的东西
<data encoding="yEnc> <![CDATA[ encoded binary data ]]> </data>
回答
就在上周,我遇到了这个问题。我必须序列化一个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看起来像这样:
<?xml version="1.0" encoding="utf-16"?> <doc> <serialized_binary types:dt="bin.base64" xmlns:types="urn:schemas-microsoft-com:datatypes"> JVBERi0xLjMKJaqrrK0KNCAwIG9iago8PCAvVHlwZSAvSW5mbw...(plus lots more) </serialized_binary> </doc>
回答
这是一个如何进行XEP-0239的好例子
PS:别忘了读莫的答案。
PS2:阅读XEP上的NOTICE(通知)部分。