如何将二进制数据嵌入XML?

时间:2020-03-05 18:41:30  来源:igfitidea点击:

我有两个用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(通知)部分。