110 votes

Comment intégrer des données binaires dans le XML ?

J'ai deux applications écrites en Java qui communiquent entre elles à l'aide de messages XML sur le réseau. J'utilise un analyseur SAX à l'extrémité réceptrice pour récupérer les données des messages. L'une des exigences est d'intégrer des données binaires dans un message XML, mais SAX n'aime pas cela. Quelqu'un sait-il comment faire ?

UPDATE : J'ai réussi à faire fonctionner ce système avec la fonction Base64 de la classe bibliothèque de codecs apache commons au cas où quelqu'un d'autre essaierait quelque chose de similaire.

223voto

Greg Hurlman Points 10944

Vous pourriez coder les données binaires à l'aide de base64 et les placer dans un élément Base64 ; l'article ci-dessous est assez bon sur le sujet.

Traitement des données binaires dans les documents XML

212voto

Mo. Points 6747

Le XML est si polyvalent...

<DATA>
  <BINARY>
    <BIT index="0">0</BIT>
    <BIT index="1">0</BIT>
    <BIT index="2">1</BIT>
    ...
    <BIT index="n">1</BIT>
  </BINARY>
</DATA>

Le XML est comme la violence : s'il ne résout pas votre problème, c'est que vous n'en utilisez pas assez.

EDIT :

BTW : Base64 + CDATA est probablement la meilleure solution.

(EDIT2 :
Si vous me upmodifiez, veuillez également upmodifier la vraie réponse. Nous ne voulons pas qu'une pauvre âme vienne ici et applique réellement ma méthode parce qu'elle était la mieux classée sur SO, n'est-ce pas ?)

9 votes

Ce n'est rien de moins qu'une utilisation tout à fait honteuse de XML si vous êtes sérieux. Et si vous ne l'êtes pas, comment les débutants qui n'écrivent pas à un niveau élevé et ne pensent pas à un niveau bas pourraient-ils le savoir ?

1 votes

Je trouve ça drôle. Mais oui, une fois de plus, l'utilisation du type de données base64 réel est la meilleure solution. CData est trop générique.

4 votes

Je ne pense pas que ce soit suffisamment descriptif - peut-être devrait-on utiliser "BINARYDIGIT" plutôt que la contraction "BIT" ? ;-)

27voto

Boris Terzic Points 6148

Base64 est effectivement la bonne réponse mais CDATA ne l'est pas, ce qui revient à dire : "ça peut être n'importe quoi", mais ça doit être no n'importe quoi, il doit s'agir de données binaires codées en Base64. Le schéma XML définit Base 64 binaire comme type de données primitif que vous pouvez utiliser dans votre xsd.

2 votes

Point supplémentaire pour avoir mentionné le xs:base64Binary qui est le bon type de données à utiliser.

14voto

Brian Travis Points 171

J'ai eu ce problème la semaine dernière. Je devais sérialiser un fichier PDF et l'envoyer, dans un fichier XML, à un serveur.

Si vous utilisez .NET, vous pouvez convertir un fichier binaire directement en une chaîne base64 et la placer dans un élément XML.

string base64 = Convert.ToBase64String(File.ReadAllBytes(fileName));

Ou bien, il existe une méthode intégrée à l'objet XmlWriter. Dans mon cas particulier, j'ai dû inclure l'espace de noms des types de données de 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();

La chaîne abc ressemble à quelque chose qui ressemble à ça :

<?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>

0 votes

Meilleure réponse car je peux copier/coller Convert.ToBase64String à partir de celui-ci

5voto

basszero Points 14539

Essayez de coder/décoder vos données binaires en Base64. Examinez également les sections CDATA

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X