如何在XML中嵌入二进制数据?

Bil*_*ard 106 java xml binary binary-data

我有两个用Java编写的应用程序,它们通过网络使用XML消息相互通信.我在接收端使用SAX解析器从消息中取出数据.其中一个要求是将二进制数据嵌入XML消息中,但SAX不喜欢这样.有谁知道如何做到这一点?

更新:我使用apache commons编解码器库中Base64类,以防其他人尝试类似的东西.

Gre*_*man 211

您可以使用base64对二进制数据进行编码,并将其放入Base64元素中; 以下文章是关于这个主题的非常好的文章.

处理XML文档中的二进制数据


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上排名最高,对吗?)

  • 哦,为了f***的缘故.这是一个笑话.我做了什么?!:http://thedailywtf.com/Articles/The-HumanReadable-Encryption-Key.aspx (33认同)
  • 如果你是认真的话,这绝对是对XML的完全不光彩的使用.如果你不是,那些不写高级别思考低级别的初学者怎么会知道呢? (9认同)
  • 我不认为它具有足够的描述性 - 也许应该使用'BINARYDIGIT'而不是收缩'BIT'?;-) (3认同)

Bor*_*zic 26

Base64确实是正确的答案,但CDATA不是,基本上说:"这可能是任何东西",但它不能只是任何东西,它必须是Base64编码的二进制数据.XML Schema将Base 64二进制文件定义可在xsd中使用的基本数据类型.

  • 提到`xs:base64Binary`数据类型的额外点,这是正确的类型. (2认同)

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)


And*_*vig 6

我通常使用MIME Base64URL编码对二进制数据进行编码.


bas*_*ero 5

尝试Base64编码/解码二进制数据.另请参阅CDATA部分


Jar*_*zki 5

任何二进制到文本的编码都可以解决问题。我用类似的东西

<data encoding="yEnc>
<![CDATA[ encoded binary data ]]>
</data>
Run Code Online (Sandbox Code Playgroud)