Bil*_*ard 106 java xml binary binary-data
我有两个用Java编写的应用程序,它们通过网络使用XML消息相互通信.我在接收端使用SAX解析器从消息中取出数据.其中一个要求是将二进制数据嵌入XML消息中,但SAX不喜欢这样.有谁知道如何做到这一点?
更新:我使用apache commons编解码器库中的Base64类,以防其他人尝试类似的东西.
Mo.*_*Mo. 206
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>
Run Code Online (Sandbox Code Playgroud)
XML就像暴力 - 如果它不能解决您的问题,那么您就没有使用它.
编辑:
BTW:Base64 + CDATA可能是最好的解决方案
(编辑方式2:
无论是谁给我打电话,也请提出真正的答案.我们不希望任何可怜的灵魂来到这里并实际实施我的方法,因为它在SO上排名最高,对吗?)
Bor*_*zic 26
Base64确实是正确的答案,但CDATA不是,基本上说:"这可能是任何东西",但它不能只是任何东西,它必须是Base64编码的二进制数据.XML Schema将Base 64二进制文件定义为可在xsd中使用的基本数据类型.
Bax*_*ell 13
上周我遇到了这个问题.我不得不序列化一个PDF文件并将其在XML文件中发送到服务器.
如果您使用的是.NET,则可以将二进制文件直接转换为base64字符串并将其粘贴到XML元素中.
string base64 = Convert.ToBase64String(File.ReadAllBytes(fileName));
Run Code Online (Sandbox Code Playgroud)
或者,在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();
Run Code Online (Sandbox Code Playgroud)
字符串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>
Run Code Online (Sandbox Code Playgroud)
任何二进制到文本的编码都可以解决问题。我用类似的东西
<data encoding="yEnc>
<![CDATA[ encoded binary data ]]>
</data>
Run Code Online (Sandbox Code Playgroud)